在使用new的时候做了两件事:

1、调用operator new分配空间

2、调用构造函数初始化对象


在使用delete的时候也做了两件事:

1、调用析构函数清理对象

2、调用operator delete函数释放空间


在使用new[N]的时候也做了两件事:

1、调用operator new分配空间

2、调用N次构造函数初始化N个对象


在使用delete[]的时候也做了两件事:

1、调用N次析构函数清理N个对象

2、调用operator delete函数释放空间




定位new表达式:定位new表达式是在以分配的原始空间中调用构造函数初始化一个对象。

new(place_address) type;

new(place_address) type(initializer-list);

place_address必须是一个指针,initializer-list是初始化列表


利用mallco/free和定位new表达式来模拟new/delete和new[]/delete[]:

例:

classA{public:A(inta=2):_a(a){cout<<"A()"<<endl;}voidShow(){cout<<_a<<endl;}~A(){cout<<"~A()"<<endl;}private:int_a;};voidtest(){//分配1个A类型空间A*pa=(A*)malloc(sizeof(A));new(pa)A(1);//调用构造函数pa->~A();//调用析构函数free(pa);//分配10个A类型的空间A*pa=(A*)malloc(sizeof(A)*10);for(inti=0;i<10;i++)//调用十次构造函数{new(pa+i)A(i);}for(inti=0;i<10;i++)//调用十次析构函数{(pa+i)->~A();}free(pa);}