一、野指针分析
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、动态链表释放