原文地址: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)"其實執行了兩個函數:
- 調用new分配記憶體
- 調用A(1)實現初始構造
而預設的new函數就只是調用了malloc和sizeof分配了一下記憶體而已,我以前還一直以為這是一個函數,建構函式也是在new中調用的。
測試delete的功能的代碼如下:
delete a;
輸出結果如下:
~A(2) called
delete
這裡也可以看出,"delete a"也是執行的兩個函數:
- 調用解構函式執行析構操作
- 調用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)"其實執行了兩個函數:
- 調用new分配記憶體
- 調用A(1)實現初始構造
而預設的new函數就只是調用了malloc和sizeof分配了一下記憶體而已,我以前還一直以為這是一個函數,建構函式也是在new中調用的。
測試delete的功能的代碼如下:
delete a;
輸出結果如下:
~A(2) called
delete
這裡也可以看出,"delete a"也是執行的兩個函數:
- 調用解構函式執行析構操作
- 調用delete釋放記憶體
此時,如果直接調用系統內建的delete,則列印完"~A(2) called"程式直接掛掉了,可見,預設的delete是調用free來釋放記憶體的(本例中a的記憶體是建立在g_num上的,故free(a)時也free了g_num,從而導致程式掛了)。