zoukankan      html  css  js  c++  java
  • 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的栈内存,一般用在解密数据的时候。

  • 相关阅读:
    linux 安装python3
    phoenix 索引实践
    spark shuffle参数调优
    hbase 面试问题汇总
    sqlserver 自动初始化从节点数据
    hive sql 窗口函数
    数据仓库建模
    Spark DataFrame简介(二)
    list删除时java.util.ConcurrentModificationException
    mybatis中判断等于字符串的条件怎么写
  • 原文地址:https://www.cnblogs.com/yfish/p/15427043.html
Copyright © 2011-2022 走看看