设为首页 加入收藏

TOP

C/C++中程序在使用堆内存时的内存复用问题
2014-11-23 20:16:29 来源: 作者: 【 】 浏览:7
Tags:C/C 程序 使用 内存 时的 复用 问题

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

先看一个程序:

#include 

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的内存,这就是问题的所在,因为这时的z占据了原来是x的内存,这就是说现在x和z的地址相同!!!这时一个可怕的bug,因为一个本该是无效的指针x现在却可以改变有效指针z指向的内容!!那怎么办呢?其实我们可以这样,每次将一个指针指向的堆内存空间释放的时候,都将指针清空,即要在delete之后加上这句代码:

x = NULL; 或者 x = 0;

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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇最长不重复子串(阿尔卡特2013年实.. 下一篇用矩形法(梯形法)求定积分

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C 内存管理 | 菜鸟教 (2025-12-26 20:20:37)
·如何在 C 语言函数中 (2025-12-26 20:20:34)
·国际音标 [ç] (2025-12-26 20:20:31)
·微服务 Spring Boot (2025-12-26 18:20:10)
·如何调整 Redis 内存 (2025-12-26 18:20:07)