一、野指針分析
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
int *p = new int; //&p是當前函數棧的地址,p是內存new出來的一個地址
delete p; //p仍然保留原來的值
p = NULL; //p爲0x00000000
二、鏈表指針釋放
struct D_Link
{
char DATA;
struct D_Link *Next;
}
D_Link *p1;
while(p !=NULL) //釋放動態鏈表指針
{
p1 = p;
p = p->next;//這裏已經將後面的節點指針覆蓋到前面的指針了,,所以不用置null,最後p->next = NULL,這時p=null
free(p1);//釋放指針,或者用delete p1;
}
三、內存管理淺析
new、delete在堆中申請內存,相應的API有HeapAlloc;malloc、free在自由存儲區釋放內存,每當申請時,操作系統應該爲該進程建立一個存儲區登記鏈表,所以一定要free掉,防止內存泄露。
另外,new出來的內存,只有在程序運行時,纔有意義。Terminate進程時,系統會回收它所有的資源(參見Windows核心編程第4版 4.3.3)。
參考:1、C/C++中delete/free指針設置null的好處
2、動態鏈表釋放