一直很好奇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 肯定會有很多...