在使用new的時候作了兩件事:ide
一、調用operator new分配空間函數
二、調用構造函數初始化對象url
在使用delete的時候也作了兩件事:spa
一、調用析構函數清理對象指針
二、調用operator delete函數釋放空間對象
在使用new[N]的時候也作了兩件事:it
一、調用operator new分配空間class
二、調用N次構造函數初始化N個對象test
在使用delete[]的時候也作了兩件事:構造函數
一、調用N次析構函數清理N個對象
二、調用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[]:
例:
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); }