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