c++内存管理

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

第一个是栈内存,函数内部局部变量是栈内存。栈内存不用我们手动管理,在调用完函数之后 函数会自动释放栈内存。实际上就是函数末尾被编译器添加的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的栈内存,一般用在解密数据的时候。

原文地址:https://www.cnblogs.com/yfish/p/15427043.html