zoukankan      html  css  js  c++  java
  • C/C++中程序在使用堆内存时的内存复用问题

    在一个C/C++程序中,如果使用了堆内存的管理机制,那么内存究竟是怎么分配与回收的呢?

    先看一个程序:

    #include <iostream>
    
    using namespace std;
    
    int main (void)
    {
        int *x = new int;
        int *y = new int;
        *x = 1;
        *y = 2;
        cout << "*x = " << *x << endl;
        cout << "x = " << x << endl;
        delete x;
        int *z = new int;
        *z = 3;
        cout << "*z = " << *z << endl;
        cout << "z = " << z << endl;
        *x = 5;
        cout << "*z = " << *z << endl;
    
        return 0;
    }
    


    输出的结果是:

    咋一看,很惊讶,为什么我修改了已经被释放的内存x不报错反而会修改了z的值呢??

    这里是因为程序使用了堆的内存管理机制,存在内存复用的问题。整个过程是:在程序释放了x的把内存时,紧接着又分配了z的内存,这就是问题的所在,因为这时的z占据了原来是x的内存,这就是说现在x和z的地址相同!!!这时一个可怕的bug,因为一个本该是无效的指针x现在却可以改变有效指针z指向的内容!!那怎么办呢?其实我们可以这样,每次将一个指针指向的堆内存空间释放的时候,都将指针清空,即要在delete之后加上这句代码:

    x = NULL; 或者 x = 0;

    虽然将一个指针清空可能使程序崩溃,但是我们宁愿使程序崩溃也不愿意让程序变得极难调试,因为当程序崩溃时,我们观察一下即可发现问题所在,但是像上面那样的程序是很难找到问题出在哪的!!!




  • 相关阅读:
    设计模式之备忘录模式
    特殊传参方式
    页面响应效率测试
    composer安装的包git无法提交的解决办法是因为安装的时候生成了.git隐藏文件
    数据结构和算法深入浅出理解
    中缀表达式转换为后缀表达式
    p2p技术
    【自动化测试】WebDriver使用
    pt-query-digest简介使用
    mac编译openJDK8
  • 原文地址:https://www.cnblogs.com/james1207/p/3271095.html
Copyright © 2011-2022 走看看