C++ delete陷阱
可能算不上陷阱这么严重,或者我可能危言耸听什么的,但这个确实是之前没有注意到的一个问题,最近一个小项目中确实吃了不少苦头。
我们知道,在C++ 动态内存操作的过程中,对于不再使用的分配过的内存一定要用delete
来释放,简单的用法可以这么来说:
new
和delete
是成对出现,new[]
和delete[]
是成对出现的。
现在很少会犯忘记释放内存delete
这样的错误,不过对于一个指针变量来说,并不是在不使用他后使用delete
就万事大吉,这里delete
过后最好置空,例如:
int *p=new int(1);
//do something
delete p;
p=NULL;//加上此句
因为delete
只负责管理动态分配的堆中的内存,而对于指针变量p本身来说,作为局部变量,他就位于栈空间,当生命周期结束会自动被释放,但是如果在该局部变量的作用域再去使用他,也许程序不会因为动态内存问题崩溃,但有可能出现逻辑错误造成不可预知的结果。简单来说:
delete
语句将申请的动态内存释放,但是原来的指针变量p仍然保存着这块内存的地址,这个时候,安全起见,我们人为的把delete
过后的指针置为NULL。
通过单步调试就很容易看到结果:
delete之前,左边是地址,右边是值
delete之后,地址不变,但由于内存释放,值已经乱七八糟了。
—————————————————–补充———————————————
在《C++ Primer》(第5版)P410页,使用动态内存管理容易出错的三点:
内存泄漏——忘记delete
使用已经释放的内存(本文提到的),通过释放内存后将指针置空检测这种错误。
同一块内存释放两次。
而第二种情况里,在delete
之后指针就变成了了人们所说的空悬指针(dangling pointer),指向一块曾经保存数据对象现在已经无效的内存测指针。