在一個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的內存,這就是問題的所在,因為這時的z占據了原來是x的內存,這就是說現在x和z的地址相同!!!這時一個可怕的bug,因為一個本該是無效的指針x現在卻可以改變有效指針z指向的內容!!那怎麼辦呢?其實我們可以這樣,每次將一個指針指向的堆內存空間釋放的時候,都將指針清空,即要在delete之後加上這句代碼:
x = NULL; 或者 x = 0;
雖然將一個指針清空可能使程序崩潰,但是我們寧願使程序崩潰也不願意讓程序變得極難調試,因為當程序崩潰時,我們觀察一下即可發現問題所在,但是像上面那樣的程序是很難找到問題出在哪的!!!