delete和delete 的區別

2021-09-22 10:09:02 字數 663 閱讀 6804

delete一共幹兩件事:

1)釋放記憶體

2)執行析構函式

就釋放記憶體來說,編譯器是根據你這個指標的位址來知道這塊記憶體的大小的,因為你申請的時候,記憶體管理器記錄了這個位址開始的申請的記憶體的大小。 所以不管是啥,內建型別(int),自定義型別還是乙個xx陣列,delete和delete[ ]都釋放了記憶體(把記憶體標記為未使用)。

但是對第二件事——執行析構函式而言,兩者是不同的,delete只會執行一次析構函式,而delete[ ]會找到陣列維度n,從陣列尾到陣列頭依次執行析構函式。所以對於那些trivial 析構而言的陣列(包括但不限於 int * a =new int[10]),delete和delete [ ] 沒有區別,但是對於那些有用的析構,(類使用了某些需要釋放的資源) 就不一樣了。

比如下面這個

class a

~a()

};a *a = new a[10];

delete a;//僅釋放了a指標指向的全部記憶體空間 但是只呼叫了a[0]物件的析構函式 剩下的從a[1]到a[9]這9個使用者自行分配的m_cbuffer對應記憶體空間將不能釋放從而造成記憶體洩漏

delete a;      //呼叫使用類物件的析構函式釋放使用者自己分配記憶體空間並且   釋放了a指標指向的全部記憶體空間

delete和delete 的區別

剛才在寫一段例子程式的時候,發現對於乙個指標型別的陣列t p,delete p和delete p的效果一樣。看了一下c primer和c programming language都沒有找到解釋,於是在網路上搜尋一下,發現了很好的解釋。整理一下 c 告訴我們在 用 new 分配的單個物件的記憶體空間的...

delete和delete 的區別

c 告訴我們在 用 new 分配的單個物件的記憶體空間的時候用 delete,用 new 分配的一組物件的記憶體空間的時候用 delete。樓主的這個問題提得很好。很多人注意到了這個問題,但是卻不清楚為什麼要這樣做,不這樣做行不行。關於 new 和 delete,其中又分為兩種情況 1 為基本資料型...

delete 和 delete 的區別

情景 今天在檢視別人寫的 時發現有類似如下 printer info 4 info4 printer info 4是乙個普通的結構 即沒寫構造和析構等函式的純資料的struct info4 printer info 4 new byte dwneeded delete info4 好奇這一句的寫法,...