new操作符(new operator)
当你写这种代码时:
string *ps = new string("Memory Management");
你使用的new是new操作符。
new操作符的动作包含两部分:
- 在堆上为创建的对象申请内存
- 调用对象的构造函数进行初始化
operator new
当你写这种代码时:
void *rawMemory = operator new(sizeof(string));
你使用的new是operator new。
operator new的职责仅仅是分配内存,它不会调用对象的构造函数进行初始化
operator new的函数声明一般如下:
void * operator new(size_t size);
- 返回值类型void*,未初始化的内存
- 參数size_t确定分配多少内存
- 你能添加额外的參数重载函数operator new,可是第一个參数类型必须是size_t。
-(有关operator new很多其它的信息參见Effective C++ 条款8至条款10。)
placement new
当你写这种代码时:
Widget *p = new (buffer) Widget(widgetSize);
你使用的new是placement new。
placement new的职责是在一块未初始化的内存上,调用对象的构造函数
以下的样例是placement new怎样使用:
点击查看代码
class Widget {public:Widget(int widgetSize);...
};Widget * constructWidgetInBuffer(void *buffer,int widgetSize)
{return new (buffer) Widget(widgetSize);
}
new (buffer) Widget(widgetSize)的职责是在buffer指向的内存上,调用Widget的构造函数
小结
- 你想在堆上建立一个对象,应该用new操作符。它既分配内存又为对象调用构造函数。
- 假设你只想分配内存,就应该调用operator new函数;它不会调用构造函数。
- 假设你想定制自己的在堆对象被建立时的内存分配过程,你应该写你自己的operator new函数。
- 假设你想在一块已经获得指针的内存里建立一个对象。应该用placement new。
參考:https://www.cnblogs.com/slgkaifa/p/6887887.html