版权声明:本文为博主原创文章,未经博主允许不得转载。 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[],同时调用析构函数。