delete 與 delete 釋放記憶體

2021-05-25 02:25:41 字數 1113 閱讀 5748

以下內容來引自:
我們通常從教科書上看到這樣的說明:

delete 釋放new分配的單個物件指標指向的記憶體

delete 釋放new分配的物件陣列指標指向的記憶體

那麼,按照教科書的理解,我們看下下面的**:

int *a = new int[10];

delete a; //方式1

delete a; //方式2

肯定會有很多人說方式1肯定存在記憶體洩漏,是這樣嗎?

1. 針對簡單型別 使用new分配後的不管是陣列還是非陣列形式記憶體空間用兩種方式均可 如:

int *a = new int[10];

delete a;

delete a;

此種情況中的釋放效果相同 原因在於分配簡單型別記憶體時,記憶體大小已經確定,系統可以記憶並且進行管理,在析構時,系統並不會呼叫析構函式,

它直接通過指標可以獲取實際分配的記憶體空間,哪怕是乙個陣列記憶體空間(在分配過程中 系統會記錄分配記憶體的大小等資訊,此資訊儲存在結構體_crtmemblockheader中,

具體情況可參看vc安裝目錄下crt/src/dbgdel.cpp)

2. 針對類class,兩種方式體現出具體差異

當你通過下列方式分配乙個類物件陣列:

class a

~a()

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

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

從而造成記憶體洩漏

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

delete ptr 代表用來釋放記憶體,且只用來釋放ptr指向的記憶體。

delete rg 用來釋放rg指向的記憶體,!!還逐一呼叫陣列中每個物件的destructor!!

對於像int/char/long/int*/struct等等簡單資料型別,由於物件沒有destructor,所以用delete 和delete 是一樣的!但是如果是c++物件陣列就不同了!

指標與delete釋放記憶體

下表列出了 c 支援的其他一些重要的運算子。運算子描述 sizeof sizeof 運算子返回變數的大小。例如,sizeof a 將返回 4,其中 a 是整數。condition x y 條件運算子。如果 condition 為真 則值為 x 否則值為 y。逗號運算子會順序執行一系列運算。整個逗號表...

delete與delete 的區別

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

delete與delete 的區別

如果是基本型別陣列呼叫delete就可以刪除之,而乙個自定義的結構陣列,卻最好使用delete,為什麼?原因如下 y new 10 delete y 10個元素所佔的記憶體都會被釋放,但是 如果有析構函式的話,只有第乙個元素的析構函式被呼叫,其他9個元素的析構函式沒有被呼叫 如果 的析構函式裡面有記...