C++的new和delete功能小窺

來源:互聯網
上載者:User

原文地址:http://www.cnblogs.com/TianFang/archive/2007/11/23/970446.html

C++的new和delete功能小窺

C++在new和delete的時候到底在幹些什嗎?

今天寫了一個小程式測試一下C++在new和delete的時候到底在幹些什麼。

int g_num = 3;

class A
{
public:
    int value;
    A(int a):value(a){cout<<"A("<<a<<") called"<<endl;}
    ~A() {cout<<"~A("<<value<<") called"<<endl;}

    void* operator new (size_t size)
    {
        cout<<endl<<"new "<<size<<endl;
        return &g_num;
    }

    void operator delete(void* p)
    {
        cout<<"delete"<<endl;
    }

};

為了檢測new和delete的動向,我重載了new和delete函數。

測試new的功能的代碼如下:

    cout<<g_num<<endl;

    cout<<endl;
    A *a = new A(1);

    cout<<g_num<<endl;
    cout<<a->value<<endl;

輸出結果為:

g_num=3

new 4
A(1) called
g_num=1
a=1

由於A的new函數並沒有分配記憶體,只是把g_num的地址賦給了它,所以A的值改變也直接導致了g_num的值改變。

由列印資訊可以看出,"new A(1)"其實執行了兩個函數:

  1. 調用new分配記憶體
  2. 調用A(1)實現初始構造

而預設的new函數就只是調用了malloc和sizeof分配了一下記憶體而已,我以前還一直以為這是一個函數,建構函式也是在new中調用的

測試delete的功能的代碼如下:

delete a;

輸出結果如下:

~A(2) called
delete

這裡也可以看出,"delete a"也是執行的兩個函數:

  1. 調用解構函式執行析構操作
  2. 調用delete釋放記憶體

此時,如果直接調用系統內建的delete,則列印完"~A(2) called"程式直接掛掉了,可見,預設的delete是調用free來釋放記憶體的(本例中a的記憶體是建立在g_num上的,故free(a)時也free了g_num,從而導致程式掛了)。

C++在new和delete的時候到底在幹些什嗎?

今天寫了一個小程式測試一下C++在new和delete的時候到底在幹些什麼。

int g_num = 3;

class A
{
public:
    int value;
    A(int a):value(a){cout<<"A("<<a<<") called"<<endl;}
    ~A() {cout<<"~A("<<value<<") called"<<endl;}

    void* operator new (size_t size)
    {
        cout<<endl<<"new "<<size<<endl;
        return &g_num;
    }

    void operator delete(void* p)
    {
        cout<<"delete"<<endl;
    }

};

為了檢測new和delete的動向,我重載了new和delete函數。

測試new的功能的代碼如下:

    cout<<g_num<<endl;

    cout<<endl;
    A *a = new A(1);

    cout<<g_num<<endl;
    cout<<a->value<<endl;

輸出結果為:

g_num=3

new 4
A(1) called
g_num=1
a=1

由於A的new函數並沒有分配記憶體,只是把g_num的地址賦給了它,所以A的值改變也直接導致了g_num的值改變。

由列印資訊可以看出,"new A(1)"其實執行了兩個函數:

  1. 調用new分配記憶體
  2. 調用A(1)實現初始構造

而預設的new函數就只是調用了malloc和sizeof分配了一下記憶體而已,我以前還一直以為這是一個函數,建構函式也是在new中調用的

測試delete的功能的代碼如下:

delete a;

輸出結果如下:

~A(2) called
delete

這裡也可以看出,"delete a"也是執行的兩個函數:

  1. 調用解構函式執行析構操作
  2. 調用delete釋放記憶體

此時,如果直接調用系統內建的delete,則列印完"~A(2) called"程式直接掛掉了,可見,預設的delete是調用free來釋放記憶體的(本例中a的記憶體是建立在g_num上的,故free(a)時也free了g_num,從而導致程式掛了)。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.