在使用new的時候做了兩件事:
1、調用operator new分配空間
2、調用構造函數初始化對象在使用delete的時候也做了兩件事:
1、調用析構函數清理對象
2、調用operator delete函數釋放空間在使用new[N]的時候也做了兩件事:
1、調用operator new分配空間
2、調用N次構造函數初始化N個對象在使用delete[]的時候也做了兩件事:
1、調用N次析構函數清理N個對象
定位new表達式:定位new表達式是在以分配的原始空間中調用構造函數初始化一個對象。
new(place_address) type;
new(place_address) type(initializer-list);
place_address必須是一個指針,initializer-list是初始化列表
利用mallco/free和定位new表達式來模擬new/delete和new[]/delete[]:
class A
{
public:
A(int a=2)
:_a(a)
{
cout << "A()"<< endl;
}
void Show()
{
cout << _a << endl;
}
~A()
{
cout << "~A()" << endl;
}
private:
int _a;
};
void test()
{
//分配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 (int i = 0; i < 10; i++) //調用十次構造函數
{
new(pa + i) A(i);
}
for (int i = 0; i < 10; i++) //調用十次析構函數
{
(pa + i)->~A();
}
free(pa);
}