天天看點

43、關于delete,new

    首先要明确一點:當我們調用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];

記憶體中示意圖分布如下:

43、關于delete,new

記憶體分布示意:

[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];//依次調用了析構函數,正确釋放了記憶體

參考