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;

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




  • 相关阅读:
    Python--day62--什么时候用GET请求和POST请求
    Python--day62--ORM的使用
    使用 vs code 搭建vue项目(一)
    jquery如何模拟分页-小白进阶
    JavaScript 实现的4种数字千位符格式化方法
    web秀
    五十个UI设计资源网站
    基于 HTML5 WebGL 的 水泥工厂可视化系统
    ASP.NET MVC图片管理(上传,预览与显示)
    jQuery使用FormData上传文件
  • 原文地址:https://www.cnblogs.com/james1207/p/3271095.html
Copyright © 2011-2022 走看看