C++中的new操作符:new operator、operator new、placement new

C++中的new操作符:new operator、operator new、placement new

new操作符(new operator)

当你写这种代码时:
string *ps = new string("Memory Management");
你使用的new是new操作符。

new操作符的动作包含两部分:

  1. 在堆上为创建的对象申请内存
  2. 调用对象的构造函数进行初始化

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