004012A6 mov dword ptr [ebp-24h],0
004012AD mov eax,dword ptr [ebp-24h]
004012B0 mov dword ptr [ebp-14h],eax
004012B3 mov dword ptr [ebp-4],0FFFFFFFFh
004012BA mov ecx,dword ptr [ebp-14h]
004012BD mov dword ptr [ebp-10h],ecx
73: delete d;
004012C0 mov edx,dword ptr [ebp-10h]
004012C3 mov dword ptr [ebp-20h],edx
004012C6 mov eax,dword ptr [ebp-20h]
004012C9 mov dword ptr [ebp-1Ch],eax
004012CC cmp dword ptr [ebp-1Ch],0
004012D0 je process+91h (004012e1)
004012D2 push 1
004012D4 mov ecx,dword ptr [ebp-1Ch]
004012D7 call @ILT+0(desk::`scalar deleting destructor') (00401005)
004012DC mov dword ptr [ebp-28h],eax
004012DF jmp process+98h (004012e8)
004012E1 mov dword ptr [ebp-28h],0
74: }
72: desk* d = new desk(10);
0040127D push 4
0040127F call @ILT+65(desk::operator new) (00401046)
00401284 add esp,4
00401287 mov dword ptr [ebp-18h],eax
0040128A mov dword ptr [ebp-4],0
00401291 cmp dword ptr [ebp-18h],0
00401295 je process+56h (004012a6)
00401297 push 0Ah
00401299 mov ecx,dword ptr [ebp-18h]
0040129C call @ILT+5(desk::desk) (0040100a)
004012A1 mov dword ptr [ebp-24h],eax
004012A4 jmp process+5Dh (004012ad)
004012A6 mov dword ptr [ebp-24h],0
004012AD mov eax,dword ptr [ebp-24h]
004012B0 mov dword ptr [ebp-14h],eax
004012B3 mov dword ptr [ebp-4],0FFFFFFFFh
004012BA mov ecx,dword ptr [ebp-14h]
004012BD mov dword ptr [ebp-10h],ecx
73: delete d;
004012C0 mov edx,dword ptr [ebp-10h]
004012C3 mov dword ptr [ebp-20h],edx
004012C6 mov eax,dword ptr [ebp-20h]
004012C9 mov dword ptr [ebp-1Ch],eax
004012CC cmp dword ptr [ebp-1Ch],0
004012D0 je process+91h (004012e1)
004012D2 push 1
004012D4 mov ecx,dword ptr [ebp-1Ch]
004012D7 call @ILT+0(desk::`scalar deleting destructor') (00401005)
004012DC mov dword ptr [ebp-28h],eax
004012DF jmp process+98h (004012e8)
004012E1 mov dword ptr [ebp-28h],0
74: }
上面是一段普通的new、delete使用代码。但是我们发现,简单的一个语句,在汇编器看来,却需要做这么多的内容,这是为什么呢,我们不妨来自习看一看:
72句:汇编中有两个函数调用,一个是new调用,也就是我们重定义的new函数,一个是构造函数,最后的几行代码主要是把构造函数返回指针赋值给一些临时变量,可忽略
73句:汇编中首先让指针和0进行了判断,然后调用了一个函数,似乎没有调用我们的delete函数,我们可以跟进去看一下:
desk::`scalar deleting destructor':
00401410 push ebp
00401411 mov ebp,esp
00401413 sub esp,44h
00401416 push ebx
00401417 push esi
00401418 push edi
00401419 push ecx
0040141A lea edi,[ebp-44h]
0040141D mov ecx,11h
00401422 mov eax,0CCCCCCCCh
00401427 rep stos dword ptr [edi]
00401429 pop ecx
0040142A mov dword ptr [ebp-4],ecx
0040142D mov ecx,dword ptr [ebp-4]
00401430 call @ILT+75(desk::~desk) (00401050)
00401435 mov eax,dword ptr [ebp+8]
00401438 and eax,1
0040143B test