new和delete解析

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函数销毁实例化对象空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值