C++ 的 new 和 delete : new operator, operator new, placement new, delete operator, operator delete
1. new operator
new operator 完成了两件事情:用于申请内存和初始化对象。
例如:
string* ps = new string("abc");
2.operator new
operator new 类似于C语言中的malloc,只是负责申请内存。
例如:
void* buffer = operator new(sizeof(string));
注意这里new前要有个operator。
3. placement new
用于在给定的内存中初始化对象。
例如:
void* buffer = operator new(sizeof(string));
buffer = new(buffer) string("abc");
调用了placement new,在buffer所指向的内存中创建了一个string类型的对象并且初始值为“abc”。
因此可以看出:new operator 可以分解operator new 和 placement new两个动作,是 operator new 和 placement new 的结合。
与new对应的delete没有 placement delete 语法,它只有两种,分别是delete operator 和 operator delete。
delete operator 和 new operator 对应,完成析构对象和释放内存的操作。而 operator delete 只是用于内存的释放,与C语言中的free相似。
例如:
string* ps = new string("abc");
...
delete ps; // 调用 delete operator ,先析构对象再释放空间。
void* buffer = operator new(sizeof(string));
...
operator delete(buffer); // 只释放空间。
那么为什么没有和placement new对应的placement delete呢? 如:
delete(buffer) p;
据说,Stroustrup 回答说,这是因为无法确认 p 所指对象是否是真的在 buffer 中。