ASM Details for new and delete

Assembly code generated by MSVC++ 6.0 for new and new[]:

Foo *pf = ::new Foo;
Foo *pf = ::new Foo[5];
push   0Ch
call   operator new (00420a70)
add    esp,4
mov    dword ptr [ebp-18h],eax
mov    dword ptr [ebp-4],0
cmp    dword ptr [ebp-18h],0
je     main+5Ah (0040168a)
push   0
push   0
push   0
mov    ecx,dword ptr [ebp-18h]
call   @ILT+530(Foo::Foo) (00401217)
mov    dword ptr [ebp-24h],eax
jmp    main+61h (00401691)
mov    dword ptr [ebp-24h],0
mov    eax,dword ptr [ebp-24h]
mov    dword ptr [ebp-14h],eax
mov    dword ptr [ebp-4],0FFFFFFFFh
mov    ecx,dword ptr [ebp-14h]
mov    dword ptr [ebp-10h],ecx
push   40h
call   operator new (00420b90)
add    esp,4
mov    dword ptr [ebp-18h],eax
mov    dword ptr [ebp-4],0
cmp    dword ptr [ebp-18h],0
je     main+75h (004016b5)
push   offset @ILT+575(Foo::~Foo) (00401244)
push   offset @ILT+130(Foo::`default constructor') (00401087)
mov    eax,dword ptr [ebp-18h]
mov    dword ptr [eax],5
push   5
push   0Ch
mov    ecx,dword ptr [ebp-18h]
add    ecx,4
push   ecx
call   `eh vector constructor iterator' (00420af0)
mov    edx,dword ptr [ebp-18h]
add    edx,4
mov    dword ptr [ebp-24h],edx
jmp    main+7Ch (004016bc)
mov    dword ptr [ebp-24h],0
mov    eax,dword ptr [ebp-24h]
mov    dword ptr [ebp-14h],eax
mov    dword ptr [ebp-4],0FFFFFFFFh
mov    ecx,dword ptr [ebp-14h]
mov    dword ptr [ebp-10h],ecx

Assembly code generated by MSVC++ 6.0 for delete and delete[]:

::delete pf;
::delete [] pf;
mov    edx,dword ptr [ebp-10h]
mov    dword ptr [ebp-24h],edx
mov    eax,dword ptr [ebp-24h]
mov    dword ptr [ebp-20h],eax
cmp    dword ptr [ebp-20h],0
je     main+0B0h (00401700)
push   0
mov    ecx,dword ptr [ebp-20h]
call   @ILT+520(Foo::`scalar destructor')
mov    dword ptr [ebp-2Ch],eax
jmp    main+0B7h (00401707)
mov    dword ptr [ebp-2Ch],0
mov    ecx,dword ptr [ebp-2Ch]
push   ecx
call   operator delete (00406ec0)
add    esp,4
mov    edx,dword ptr [ebp-10h]
mov    dword ptr [ebp-24h],edx
mov    eax,dword ptr [ebp-24h]
mov    dword ptr [ebp-20h],eax
cmp    dword ptr [ebp-20h],0
je     main+0B0h (004016f0)
push   3
mov    ecx,dword ptr [ebp-20h]
call   @ILT+315(Foo::`vector destructor')
mov    dword ptr [ebp-2Ch],eax
jmp    main+0B7h (004016f7)
mov    dword ptr [ebp-2Ch],0

This code:

char *buffer = ::new char[sizeof(Foo)];  // allocate 12 bytes on the heap
Foo *pf2 = ::new (buffer) Foo(1, 2, 3);  // construct a Foo object in buffer (placement)
generates this:

char *buffer = ::new char[sizeof(Foo)];  // allocate 12 bytes on the heap
push 0Ch call operator new (004210b0) add esp,4 mov dword ptr [ebp-20h],eax mov eax,dword ptr [ebp-20h] mov dword ptr [ebp-10h],eax
Foo *pf2 = ::new (buffer) Foo(1, 2, 3); // construct a Foo object in buffer (placement)
mov ecx,dword ptr [ebp-10h] push ecx push 0Ch call @ILT+80(operator new) (00401055) add esp,8 mov dword ptr [ebp-28h],eax mov dword ptr [ebp-4],0 cmp dword ptr [ebp-28h],0 je main+77h (004016d7) push 3 push 2 push 1 mov ecx,dword ptr [ebp-28h] call @ILT+555(Foo::Foo) (00401230) mov dword ptr [ebp-44h],eax jmp main+7Eh (004016de) mov dword ptr [ebp-44h],0 mov edx,dword ptr [ebp-44h] mov dword ptr [ebp-24h],edx mov dword ptr [ebp-4],0FFFFFFFFh mov eax,dword ptr [ebp-24h] mov dword ptr [ebp-14h],eax


This code:

int main(void)
{
  Foo f(1, 2, 3);  // create Foo on the stack
  return 0;
}

generates this:


  Foo f(1, 2, 3);
  
0041B1AE  push        3    
0041B1B0  push        2    
0041B1B2  push        1    
0041B1B4  lea         ecx,[f] 
0041B1B7  call        Foo::Foo (419C35h)
return 0;
0041B1BC  mov         dword ptr [ebp-0DCh],0 
0041B1C6  lea         ecx,[f] 
0041B1C9  call        Foo::~Foo (419CF3h) 
0041B1CE  mov         eax,dword ptr [ebp-0DCh] 


This code:

int main(void)
{
  Foo *pf1 = ::new Foo(1, 2, 3); // allocate memory, construct
  ::delete pf1;                  // destroy, deallocate memory
}

generates this:


  Foo *pf = ::new Foo(1, 2, 3); // allocate memory, construct
  
0041B1D3  push        0Ch  
0041B1D5  call        operator new (419EA6h)
0041B1DA  add         esp,4 
0041B1DD  mov         dword ptr [ebp-0F8h],eax 
0041B1E3  mov         dword ptr [ebp-4],0 
0041B1EA  cmp         dword ptr [ebp-0F8h],0 
0041B1F1  je          main+6Ch (41B20Ch) 
0041B1F3  push        3    
0041B1F5  push        2    
0041B1F7  push        1    
0041B1F9  mov         ecx,dword ptr [ebp-0F8h] 
0041B1FF  call        Foo::Foo (419C3Fh)
0041B204  mov         dword ptr [ebp-10Ch],eax 
0041B20A  jmp         main+76h (41B216h) 
0041B20C  mov         dword ptr [ebp-10Ch],0 
0041B216  mov         eax,dword ptr [ebp-10Ch] 
0041B21C  mov         dword ptr [ebp-104h],eax 
0041B222  mov         dword ptr [ebp-4],0FFFFFFFFh 
0041B229  mov         ecx,dword ptr [ebp-104h] 
0041B22F  mov         dword ptr [pf],ecx 
::delete pf; // destroy, deallocate memory
0041B232  mov         eax,dword ptr [pf] 
0041B235  mov         dword ptr [ebp-0E0h],eax 
0041B23B  mov         ecx,dword ptr [ebp-0E0h] 
0041B241  mov         dword ptr [ebp-0ECh],ecx 
0041B247  cmp         dword ptr [ebp-0ECh],0 
0041B24E  je          main+0C5h (41B265h) 
0041B250  push        0    
0041B252  mov         ecx,dword ptr [ebp-0ECh] 
0041B258  call        Foo::`scalar deleting destructor' (419BA4h)
0041B25D  mov         dword ptr [ebp-10Ch],eax 
0041B263  jmp         main+0CFh (41B26Fh) 
0041B265  mov         dword ptr [ebp-10Ch],0 
0041B26F  mov         edx,dword ptr [ebp-10Ch] 
0041B275  push        edx  
0041B276  call        operator delete (419591h)
0041B27B  add         esp,4 
return 0;
0041B27E  xor         eax,eax 


int main(void)
{
  try {
    T *pt = ::new T[5];
    ::delete [] pt;
  }
  catch (const char *e) {
    std::cout << e << std::endl;
  }

  return 0;
}

T *pt = ::new T[5];
    
00416DAE  push        9    
00416DB0  call        operator new[] (4155FAh) 
00416DB5  add         esp,4 
00416DB8  mov         dword ptr [ebp-11Ch],eax 
00416DBE  mov         eax,dword ptr [ebp-11Ch] 
00416DC4  mov         dword ptr [ebp-108h],eax 
00416DCA  mov         byte ptr [ebp-4],1 
00416DCE  cmp         dword ptr [ebp-108h],0 
00416DD5  je          main+0A1h (416E11h) 
00416DD7  mov         ecx,dword ptr [ebp-108h] 
00416DDD  mov         dword ptr [ecx],5 
00416DE3  push        offset T::~T (4155C3h) 
00416DE8  push        offset T::T (415B63h) 
00416DED  push        5    
00416DEF  push        1    
00416DF1  mov         edx,dword ptr [ebp-108h] 
00416DF7  add         edx,4 
00416DFA  push        edx  
00416DFB  call        `eh vector constructor iterator' (415A1Eh) 
00416E00  mov         eax,dword ptr [ebp-108h] 
00416E06  add         eax,4 
00416E09  mov         dword ptr [ebp-120h],eax 
00416E0F  jmp         main+0ABh (416E1Bh) 
00416E11  mov         dword ptr [ebp-120h],0 
00416E1B  mov         ecx,dword ptr [ebp-120h] 
00416E21  mov         dword ptr [ebp-114h],ecx 
00416E27  mov         byte ptr [ebp-4],0 
00416E2B  mov         edx,dword ptr [ebp-114h] 
00416E31  mov         dword ptr [pt],edx