delete與delete 真正差別

2021-09-07 10:42:32 字數 1265 閱讀 1437

我們通常從教科書上看到這種說明:

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++物件陣列就不同了!

關於 new 和 delete。當中又分為兩種情況:(1) 為基本資料型別分配和**空間;(2) 為自己定義型別分配和**空間。

對於 (1)。上面提供的程式已經證明了 delete 和 delete 是等同的。

可是對於 (2),情況就發生了變化。

delete 和 delete 的真正區別

我們通常從教科書上看到這樣的說明 delete 釋放new分配的單個物件指標指向的記憶體 delete 釋放new分配的物件陣列指標指向的記憶體 那麼,按照教科書的理解,我們看下下面的 int a new int 10 delete a 方式1 delete a 方式2 肯定會有很多人說方式1肯定存...

delete 和 delete 的真正區別

c 中對new申請的記憶體的釋放方式有delete和delete兩種方式,到底這兩者有什麼區別呢?1.我們通常從教科書上看到這樣的說明 delete 釋放new分配的單個物件指標指向的記憶體 delete 釋放new分配的物件陣列指標指向的記憶體 那麼,按照教科書的理解,我們看下下面的 int a ...

delete 和 delete 的真正區別

c 中對new申請的記憶體的釋放方式有delete和delete 兩種方式,到底這兩者有什麼區別呢?1.我們通常從教科書上看到這樣的說明 delete 釋放new分配的單個物件指標指向的記憶體 delete 釋放new分配的物件陣列指標指向的記憶體 那麼,按照教科書的理解,我們看下下面的 int a...