new/delete和new[ ]/delete[ ]的底層調用和簡單實現

在使用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);  
}  
發佈了123 篇原創文章 · 獲贊 15 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章