设为首页 加入收藏

TOP

逆向角度看C++的析构函数(五)
2013-04-10 11:53:50 来源: 作者: 【 】 浏览:1088
Tags:逆向 角度 函数

 

  00401050   push        ebp

  00401051   mov         ebp,esp

  00401053   push        0FFh

  00401055   push        offset __ehhandler$ fun@@YAXVCExample@@@Z (004133f9)

  0040105A   mov         eax,fs:[00000000]

  00401060   push        eax

  00401061   mov         dword ptr fs:[0],esp

  00401068   sub         esp,40h

  0040106B   push        ebx

  0040106C   push        esi

  0040106D   push        edi

  0040106E   lea         edi,[ebp-4Ch]

  00401071   mov         ecx,10h

  00401076   mov         eax,0CCCCCCCCh

  0040107B   rep stos    dword ptr [edi]

  0040107D   mov         dword ptr [ebp-4],0; EBP = 1244868,以上为建立堆栈代码

  26:     printf("In F(CExample)\n");

  00401084   push        offset string "In F(CExample)\n" (0042501c)

  00401089   call        printf (00401320)

  0040108E   add         esp,4

  27:     return ;

  00401091   mov         dword ptr [ebp-4],0FFFFFFFFh

  00401098   lea         ecx,[ebp+8]; EBP+8 = 1244876,是 Temp 的内存地址

  ; ECX 寄存器保存

  0040109B   call        @ILT+5(CExample::~CExample) (0040100a); 调用析构函数,销毁 Temp 对象(生命期结束)

  28:   }

  004010A0   mov         ecx,dword ptr [ebp-0Ch]

  004010A3   mov         dword ptr fs:[0],ecx

  004010AA   pop         edi

  004010AB   pop         esi

  004010AC   pop         ebx

  004010AD   add         esp,4Ch

  004010B0   cmp         ebp,esp

  004010B2   call        __chkesp (00401780)

  004010B7   mov         esp,ebp

  004010B9   pop         ebp; 恢复EBP,EBP = 1245000

  004010BA   ret

  下面重点分析一下调用 fun 函数时程序的工作机制:

 

  执行“fun(A);”时,首先先调用拷贝构造函数,创建一个实体对象Temp,占8个字节长度的栈空间,内容是拷贝 A 的内容;然后再把对象 Temp 的内存地址压入 fun 函数的堆栈中,调用 fun 函数,当 fun 函数结束时,调用析构函数销毁 Temp 对象,从此 Temp 对象所占的栈空间被回收

        

首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++类机制的实现细节 下一篇C++的内联函数应放在哪

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: