博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++中程序在使用堆内存时的内存复用问题
阅读量:5296 次
发布时间:2019-06-14

本文共 830 字,大约阅读时间需要 2 分钟。

在一个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的值呢??

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

x = NULL; 或者 x = 0;

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

 

转载于:https://www.cnblogs.com/james1207/p/3271095.html

你可能感兴趣的文章
目录相关的操作
查看>>
C++----练习--引用头文件
查看>>
ajax连接服务器框架
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
利用maven管理项目之POM文件配置
查看>>
FUSE-用户空间文件系统
查看>>
 VS2012 C#调用C++ dll
查看>>
TCL:表格(xls)中写入数据
查看>>
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
bash使用规则
查看>>
AVL数
查看>>
C语言程序设计II—第九周教学
查看>>
全栈12期的崛起之捡点儿有用的说说
查看>>
基础类型
查看>>
属性动画
查看>>
标识符
查看>>
路由跟踪工具0trace
查看>>
给大家分享一张CSS选择器优选级图谱 !
查看>>
Win7中不能调试windows service
查看>>