C++ 动态内存的分配与释放反汇编代码【DEBUG】

#include<iostream>
int  main(){
00D14350  push        ebp  
00D14351  mov         ebp,esp  
00D14353  sub         esp,0D8h  
00D14359  push        ebx  
00D1435A  push        esi  
00D1435B  push        edi  
00D1435C  lea         edi,[ebp-0D8h]  
00D14362  mov         ecx,36h  
00D14367  mov         eax,0CCCCCCCCh  
00D1436C  rep stos    dword ptr es:[edi]  
int * pt = new int ;
00D1436E  push        4   ;申请空间所需要的参数,该参数的作用:表示所要申请空间的大小,这里为4 bytes  ;还会执行一些其他的操作,例如一些对象的初始化
00D14370  call        operator new (0D11375h)   ;申请内存空间,并将申请到的内存空间的地址存放到 eax 寄存器中作为返回值
00D14375  add         esp,4   ;该语句的作用是使栈保持平衡
00D14378  mov         dword ptr [ebp-0D4h],eax   ;
00D1437E  mov         eax,dword ptr [ebp-0D4h]  
00D14384  mov         dword ptr [pt],eax       ; pt = 003CF878  ebp = 003CF880   esp = 003CF79C  ,此处用于将申请到的地址保存到main的栈帧中
*pt = 1;
00D14387  mov         eax,dword ptr [pt]  
00D1438A  mov         dword ptr [eax],1          ;将在堆中申请的空间初始化为 1 
return 0;
00D14390  xor         eax,eax  

}


call operator new(0d11375h) 对应的汇编代码

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
        {       // try to allocate size bytes
5B726760  push        ebp  
5B726761  mov         ebp,esp  
5B726763  sub         esp,10h   ; 分配局部变量的存储空间 如 p 、size 等
        void *p;
        while ((p = malloc(size)) == 0)
5B726766  mov         eax,dword ptr [size]  
5B726769  push        eax  
5B72676A  call        malloc (5B738B10h)      ;使用malloc 函数分配内存
5B72676F  add         esp,4  
5B726772  mov         dword ptr [p],eax  ; eax寄存器保存了返回内存的地址,申请内存失败时返回 0 
5B726775  cmp         dword ptr [p],0  ;测试分配内存是否成功,成功跳转到 new + 43h ,tips 为0 时表示分配内存失败,非0时分配成功
5B726779  jne         operator new+43h (5B7267A3h)    
                if (_callnewh(size) == 0)
5B72677B  mov         ecx,dword ptr [size]  
5B72677E  push        ecx  
5B72677F  call        _callnewh (5B656980h)  
5B726784  add         esp,4  
5B726787  test        eax,eax  
5B726789  jne         operator new+41h (5B7267A1h)  
                {       // report no memory
                        _THROW_NCEE(_XSTD bad_alloc, );
5B72678B  lea         ecx,[ebp-10h]  
5B72678E  call        std::bad_alloc::bad_alloc (5B6574E0h)  
                {       // report no memory
                        _THROW_NCEE(_XSTD bad_alloc, );
5B726793  push        5B773278h  
5B726798  lea         edx,[ebp-10h]  
5B72679B  push        edx  
5B72679C  call        _CxxThrowException (5B71B110h)  
                }
5B7267A1  jmp         operator new+6h (5B726766h)  


        return (p);
5B7267A3  mov         eax,dword ptr [p]   ; 返回申请空间的地址
        }
5B7267A6  mov         esp,ebp  ; 恢复上下文,返回到调用函数继续执行
5B7267A8  pop         ebp  
5B7267A9  ret  


思考:1、堆位于什么地方?

2、该代码并没有释放堆中的内存,那么被申请的堆中的内存将会发生什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值