一、定位new表达式的常见形式
new(address) type;
new(address) type(initializers);
new(address) type[size];
new(address) type[size]{braced initializer list};
//定位new表达式调用 void *operator new(size_t, void *); 分配内存。
//address必须是个指针,指向已经分配好的内存。为了使用这种形式的new表达式,必须包含头文件<new>。
//定位new表达式不能调用delete删除定位new生成的对象,需要人为调用对象的析构函数,并人为释放掉占用的内存。
二、定位new表达式的作用
创建对象但是不分配内存,而是在已有的内存块上面创建对象。用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗。
三、实例:
#include <iostream>
#include <new>
using namespace std;
const int chunk = 16;
class Foo
{
public:
int val(){return _val;}
Foo(){_val=0;}
private:
int _val;
};
int main()
{
// 预分配内存buf
char *buf = new char[sizeof(Foo) * chunk];
// 在buf中创建一个Foo对象
Foo *pb=new (buf) Foo;
// 检查一个对象是否被放在buf中
if(pb->val()==0) cout<<"new expression worked!"<<endl;
// 这里不存在与定位new表达式匹配的delete表达式,即:delete pb
// 其实只是为了释放内存的话,我们不需要这样的表达式,因为定位new表达式并不分配内存。
// 如果在析构函数中要做一些其他的操作呢?就要显示的调用析构函数。
// 当程序不再需要buf时,buf指向的内存被删除,它所包含的任何对象的生命期也就都结束了。
delete[] buf;
return 0;
}