首先要明确一點:當我們調用new表達式時,做兩件事:使用operator new()配置設定記憶體,然後調用構造函數。在delete中調用析構函數,然後用operator delete()釋放記憶體。
大家都知道new對應于delete,new[]對應于delete[]。可以實際應用中,倒底有什麼差別?現在作一說明。
1、内置類型
如char *pc = new[10];
對于内置類型來說,可以認為delete與delete[]沒有差別。使用new[]配置設定的記憶體,同樣可以通過delete來釋放。這是因為,pc 指針所指的前一個位元組儲存了配置設定資料的大小,如下所示:
[10][0][0][0][0][0][0][0][0][0][0]
使用delete[] 釋放記憶體時,也是通知系統該指針是指向數組的。是以:
對于内置類型,delete與delete[]都能夠正确的回收記憶體。
2、對于自定義的類對象
對于自定義的類對象,則必須new[]與delete[]對應起來。因為,delete不僅是釋放記憶體的過程,也同時調用相應對象的析構函數。如下所示:
class A
{
A()
m_pstr = new char[10];
}
~A()
delete[] m_pstr;
m_pstr = NULL;
A *pObj = new A[10];
記憶體中示意圖分布如下:
記憶體分布示意:
[10*sizeof(A)][A0][A1].....[A9]
如果調用delete pObj,那麼隻是回收A0到A9的記憶體,同時調用A0的析構函數~A(),對于A1到A9不調用析構函數,也就是A1到A9對象中m_pstr所指向的記憶體沒有得到釋放,這樣就造成了記憶體洩露!
而如果調用delete[] pObj,則對于pObj所指向記憶體中的每一個對象,都調用構構函數。
for(int i= 0; i <n; i++) //n為對象個數
delete pObj[i];//依次調用了析構函數,正确釋放了記憶體
參考