条款8:了解各种不同意义的new和delete

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Sea_muxixi/article/details/84570952

1:new operator

string *ps = new string("Memory Management");

这个代码很熟悉,主要做两件事情:一是分配足够的内存,用来放置某类型对象,二是调用构造函数为对象设定初值。

new operator 总是做这两件事,无论如何你不能改变其行为。无法重载

2:operator new

void * operator new(size_t size);
void * rawMemory = operator new(sizeof(String));

operator new 执行必要的内存分配动作,返回值是一个指针,指向一块原始的、未设初值的内存。你可以重写或者重载这个函数,可以加额外的参数,但是第一参数类型必须是size_t。

operator new 和 malloc一样,唯一任务就是分配内存。

new operator肯定会调用operator new。

3.placement new

class Widget
{
public:
	Widget(int widgetSize);
};
Widget* constructWidgetInBuffer(void* buffer, int widgetSize)
{
	return new (buffer)Widget(widgetSize);
}

placement new是在已经分配号的原始内存,构建对象。这是特殊版本的operator new

上述代码实现的功能就是在buffer这块内存构建Widget对象,并返回指向这个对象的指针。

简单点,可以这样:

	void* buff = operator new(10);
	string* a = new (buff) string("123");
	cout << (*a) << endl; 
	string* b = new (buff) string("1234");
	cout << (*b) << endl;
	cout << (*a) << endl;

上面输出:
 

123

1234

1234

4:删除(Deletion)与内存释放(Deallocation)\

如果只打算处理原始的、未设初始值的内存,应该用operator new取得内存,并用operator delere归还给系统。

void *buffer = operator new(50*sizeof(char));
operator delete(buffer);

这个C++调用malloc和new。

对于使用placement new在内存块中产生的对象,应该调用对象的析构函数,再调用palcement delete。

class Widget
{
public:
	Widget(int widgetSize);
};
Widget* constructWidgetInBuffer(void* buffer, int widgetSize)
{
	return new (buffer)Widget(widgetSize);
}
int main()
{
	void* mallocShared(size_t size); //分配内存
	void freeShared(void* memory);//释放内存
	void* sharedMemory = mallocShared(sizeof(Widget));
	Widget *pw = constructWidgetInBuffer(sharedMemory, 10);//placement new
	delete pw;//无定义!因为sharedMemory不是来自operator new
	pw->~Widget();//可以!析构pw所指的widget对象,但并未释放Widget占用的内存
	freeShared(pw);//可以!释放pw所指的内存,不调用任何析构函数
}

5:new[] 和delete[]

string *ps = new string[10];
delete[] ps;

这里的内存不是已operator new分配,而是以operator new[]负责分配。并且会为每一个对象调用构造函数。可以重载。

释放内存的时候调用 delete[],同时调用析构函数。

猜你喜欢

转载自blog.csdn.net/Sea_muxixi/article/details/84570952