• 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的栈内存,一般用在解密数据的时候。

  • 相关阅读:
    阿狸的打字机(bzoj 2434)
    Censoring(bzoj 3940)
    文本生成器(bzoj 1030)
    病毒(bzoj 2938)
    Road(bzoj 2750)
    codevs 2370 小机房的树
    HDU 2838 Cow Sorting
    luogu P2253 好一个一中腰鼓!
    hdu 1166 敌兵布阵
    luogu P1901 发射站
  • 原文地址:https://www.cnblogs.com/yfish/p/15427043.html
Copyright © 2020-2023  润新知