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),指向一块曾经保存数据对象现在已经无效的内存测指针。
本文讨论了C++中使用动态内存管理时容易忽略的陷阱,特别是关于delete操作后置空指针的重要性,解释了内存泄漏和空悬指针的概念,并提供了防止这些错误的方法。
1279

被折叠的 条评论
为什么被折叠?



