delete與delete 的區別

2022-09-20 08:48:12 字數 2814 閱讀 2025

一直很好奇delete 和 delete 有什麼不同?今天我從彙編的角度看一看

測試源**

#include int main()

使用vs2019檢視其內部實現

可以看到兩個內部實現是一樣的,說明delete 和 delete 使用沒有區別

可是在網上查詢資料說,當析構物件陣列時必須要用delete ,如果使用delete的話會只呼叫陣列第乙個物件的析構函式。下面用vs看看

測試源**

#include ;

using namespace std;

class t

~t()

};int main()

使用vs2019檢視其內部實現

delete

00032590 push ebp

00032591 mov ebp,esp

00032593 sub esp,0cch

00032599 push ebx

0003259a push esi

0003259b push edi

0003259c push ecx

0003259d lea edi,[ebp-0ch]

000325a0 mov ecx,3

000325a5 mov eax,0cccccccch

000325aa rep stos dword ptr es:[edi]

000325ac pop ecx

000325ad mov dword ptr [this],ecx

000325b0 mov ecx,dword ptr [this]

000325b3 call t::~t (031514h)

000325b8 mov eax,dword ptr [ebp+8]

000325bb and eax,1

000325be je __$encstackinitstart+31h (0325ceh)

000325c0 push 1

000325c2 mov eax,dword ptr [this]

000325c5 push eax

000325c6 call operator delete (0310a0h)

000325cb add esp,8

000325ce mov eax,dword ptr [this]

000325d1 pop edi

000325d2 pop esi

000325d3 pop ebx

000325d4 add esp,0cch

000325da cmp ebp,esp

000325dc call __rtc_checkesp (0312f3h)

000325e1 mov esp,ebp

000325e3 pop ebp

000325e4 ret 4

可以看到000325b3處的call t::~t (031514h) 呼叫了一次析構函式

可以看到上面00cf26b7處將析構函式的位址作為第4個引數放入棧中,然後呼叫了00cf26c9處的eh vector destructor iterator函式,下面看看其內部實現

上面是乙個典型的while迴圈,

00cf2ef6  mov         ecx,dword ptr [destructor]  

00cf2ef9 mov dword ptr [ebp-28h],ecx

00cf2efc mov edx,dword ptr [ebp-28h]

00cf2eff mov dword ptr [ebp-20h],edx

將析構函式放入ebp-20處,00cf2f0e call dword ptr [ebp-20h] 呼叫了析構函式。看來delete 是在釋放記憶體前呼叫了物件陣列的所有析構函式。

總結:​ 當釋放基本資料型別陣列記憶體時,delete和delete 是一樣的,而當釋放物件陣列記憶體時,delete只會呼叫首位址物件的析構函式,而delete 是在釋放記憶體前呼叫了物件陣列的所有析構函式。

delete與delete 的區別

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

delete與delete 的區別

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

delete 與 delete 釋放記憶體

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