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、该代码并没有释放堆中的内存,那么被申请的堆中的内存将会发生什么?