0x00 new 和 delete 源码
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{ // report no memory
_THROW_NCEE(_XSTD bad_alloc, );
}
return (p);
}
void operator delete( void * p )
{
RTCCALLBACK(_RTC_Free_hook, (p, 0));
free( p );
}
0x01 测试new和delete对类对象的操作解析
int main(int argc, char* argv[])
{
circular* mycircular = new circular();
delete mycircular;
return 0;
}
使用反编译工具查看汇编代码
//circular* mycircular = new circular();
00A61A0D push 8
00A61A0F call operator new (0A61348h) //先申请内存空间
00A61A14 add esp,4
00A61A17 mov dword ptr [ebp-0ECh],eax
00A61A1D mov dword ptr [ebp-4],0
00A61A24 cmp dword ptr [ebp-0ECh],0
00A61A2B je main+70h (0A61A40h)
00A61A2D mov ecx,dword ptr [ebp-0ECh]
00A61A33 call circular::circular (0A610F5h) //调用circular构造函数
00A61A38 mov dword ptr [ebp-10Ch],eax
00A61A3E jmp main+7Ah (0A61A4Ah)
00A61A40 mov dword ptr [ebp-10Ch],0
00A61A4A mov eax,dword ptr [ebp-10Ch]
00A61A50 mov dword ptr [ebp-0E0h],eax
00A61A56 mov dword ptr [ebp-4],0FFFFFFFFh
00A61A5D mov ecx,dword ptr [ebp-0E0h]
00A61A63 mov dword ptr [mycircular],ecx
//delete mycircular;
00A61A66 mov eax,dword ptr [mycircular]
00A61A69 mov dword ptr [ebp-104h],eax
00A61A6F mov ecx,dword ptr [ebp-104h]
00A61A75 mov dword ptr [ebp-0F8h],ecx
00A61A7B cmp dword ptr [ebp-0F8h],0
00A61A82 je main+0C9h (0A61A99h)
00A61A84 push 1
00A61A86 mov ecx,dword ptr [ebp-0F8h]
00A61A8C call circular::`scalar deleting destructor' (0A614BAh) //调用circular的析构函数
00A61A91 mov dword ptr [ebp-10Ch],eax
00A61A97 jmp main+0D3h (0A61AA3h)
00A61A99 mov dword ptr [ebp-10Ch],0
00A61A9D push eax
00A61AA1 call operator delete (01221145h) //调用delete释放空间
00A61AA5 add esp,4
0x02 总结
结合new的delete的源码来看,new和delete在底层内部是套用了malloc和free函数,但是创建对象的时候new先创建空间,后再调用类对象的构造函数。销毁对象的时候实例对象先调用析构函数对对象内的需要释放的参数进行释放,之后再调用delete函数销毁实例化对象空间。