在一個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;
雖然將一個指針清空可能使程序崩潰,但是我們寧願使程序崩潰也不願意讓程序變得極難調試,因為當程序崩潰時,我們觀察一下即可發現問題所在,但是像上面那樣的程序是很難找到問題出在哪的!!!