以下內容來引自:
我們通常從教科書上看到這樣的說明: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個元素的析構函式沒有被呼叫 如果 的析構函式裡面有記...