C 中的delete和delete 的區別

2021-08-21 05:32:01 字數 1176 閱讀 1241

以前看書的時候,書上說使用new申請的記憶體,釋放時用delete,使用new [ ]申請的記憶體釋放時要用delete [ ]才行,這兩個一定要記住,申請時用了方括號,則釋放時也要加上方括號,否則就會出錯。但是並沒有解釋為什麼這樣,會出什麼錯。今天正好看到這個,記錄下。

關於動態申請的記憶體,分兩種情況:基本資料型別的分配和自定義資料型別的分配。兩者不同。

對於基本資料型別,假如有如下**

int *a = new int[10];

delete a;    // 方式1

delete [ ] a;    //方式2

肯定會不少人認為方式1存在記憶體洩露,然而事實上是不會!針對簡單的基本資料型別,方式1和方式2均可正常工作,因為:基本的資料型別物件沒有析構函式,並且new 在分配記憶體時會記錄分配的空間大小,則delete時能正確釋放記憶體,無需呼叫析構函式釋放其餘指標。因此兩種方式均可。

這裡一般指類,假設通過new申請了乙個物件陣列,注意是物件陣列,返回乙個指標,對於此物件陣列的記憶體釋放,需要做兩件事情:一是釋放最初申請的那部分空間,二是呼叫析構函式完成清理工作。對於記憶體空間的清理,由於申請時記錄了其大小,因此無論使用delete還是delete[ ]都能將這片空間完整釋放,而問題就出在析構函式的呼叫上,當使用delete時,僅僅呼叫了物件陣列中第乙個物件的析構函式,而使用delete [ ]的話,將會逐個呼叫析構函式。

有如下**:

#include ;

using namespace std;

class t

~t()

};int main()

輸出結果為

可以看到,不加[ ]符號時確實只呼叫了一次析構函式。

問題來了,既然不加方括號也能完整釋放記憶體,那不就沒多呼叫幾個析構函式嗎,怎麼了?想想看,萬一析構函式需要釋放系統資源呢?比如檔案?執行緒?埠?這些東西使用了而不釋放將會造成嚴重的後果。因此,雖然記憶體完整的釋放了,但是有時候不呼叫析構函式則會造成潛在的危險。

所以new的時候使用了[ ],那麼delete的時候還是使用[ ]吧!

C 中delete和delete 的區別

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

C 中delete和delete 的區別

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

C 中的delete和delete 區別

一直對c 中的delete和delete的區別不甚了解,今天遇到了,上網查了一下,得出了結論。做個備份,以免丟失。c 告訴我們在 用 new 分配的單個物件的記憶體空間的時候用 delete,用 new 分配的一組物件的記憶體空間的時候用 delete。關於 new 和 delete,其中又分為兩種...