ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

c++内存管理

2021-10-19 23:31:07  阅读:403  来源: 互联网

标签:4KB 函数 esp 管理 c++ eax 内存 push


我们写一个函数,里面必然会用到变量,每个变量都会占用内存,这些内存分成三个种类。

第一个是栈内存,函数内部局部变量是栈内存。栈内存不用我们手动管理,在调用完函数之后 函数会自动释放栈内存。实际上就是函数末尾被编译器添加的mov esp,ebp和pop ebp。

栈内存的大小是有两个大小,一个是reserve ,保留大小。一般是1MB,就是1024*1024字节。一个是1KB,这个4KB是 commit 内存,就是4096字节。reserve内存是说这部分虚拟内存已经预订了,不要再往出分配了,这部分虚拟内存没有和物理内存建立对应关系,你是不能使用这部分内存的。commit内存是说这部分虚拟内存已经和物理内存建立对应关系了,你可以使用这部分内存。当

c++程序默认分配的commit内存是4KB,当你使用的栈内存大于4kb的时候,会在1MB的reserve内存中设置一部分内存为commit内存。

 

当你函数中申请的栈内存大于4KB的时候,比如下面


int main(int argc, char* argv[])
{


char str[4100]={0};
scanf("%s",str);

printf("%s",str);


return 0;
}


 

 

 

生成的汇编代码会有一探针函数。

mov     eax, 1004h
call    __alloca_probe
push    edi
mov     ecx, 400h
xor     eax, eax
lea     edi, [esp+1008h+var_1003]
mov     [esp+1008h+var_1004], 0
rep stosd
stosw
stosb
lea     eax, [esp+1008h+var_1004]
push    eax
push    offset Format   ; "%s"
call    _scanf
add     esp, 8
lea     ecx, [esp+1008h+var_1004]
push    ecx
push    offset Format   ; "%s"
call    sub_401050
add     esp, 8
xor     eax, eax
pop     edi
add     esp, 1004h
retn
_main endp

 

__alloca_probe 这个就是探针函数。 在逆向分析的时候,如果遇到这个探针函数,那么就知道了这个使用了至少4KB的栈内存,一般用在解密数据的时候。

 

标签:4KB,函数,esp,管理,c++,eax,内存,push
来源: https://www.cnblogs.com/yfish/p/15427043.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有