C++ delete陷阱

来源:互联网 发布:fdd网络 编辑:程序博客网 时间:2024/06/16 03:25

C++ delete陷阱

可能算不上陷阱这么严重,或者我可能危言耸听什么的,但这个确实是之前没有注意到的一个问题,最近一个小项目中确实吃了不少苦头。

我们知道,在C++ 动态内存操作的过程中,对于不再使用的分配过的内存一定要用delete来释放,简单的用法可以这么来说:

newdelete是成对出现,new[]delete[]是成对出现的。

现在很少会犯忘记释放内存delete这样的错误,不过对于一个指针变量来说,并不是在不使用他后使用delete就万事大吉,这里delete过后最好置空,例如:

int *p=new int(1);//do somethingdelete p;p=NULL;//加上此句

因为delete只负责管理动态分配的堆中的内存,而对于指针变量p本身来说,作为局部变量,他就位于栈空间,当生命周期结束会自动被释放,但是如果在该局部变量的作用域再去使用他,也许程序不会因为动态内存问题崩溃,但有可能出现逻辑错误造成不可预知的结果。简单来说:

delete语句将申请的动态内存释放,但是原来的指针变量p仍然保存着这块内存的地址,这个时候,安全起见,我们人为的把delete过后的指针置为NULL。

通过单步调试就很容易看到结果:

这里写图片描述
delete之前,左边是地址,右边是值


这里写图片描述
delete之后,地址不变,但由于内存释放,值已经乱七八糟了。


—————————————————–补充———————————————

在《C++ Primer》(第5版)P410页,使用动态内存管理容易出错的三点:

内存泄漏——忘记delete
使用已经释放的内存(本文提到的),通过释放内存后将指针置空检测这种错误。
同一块内存释放两次。

而第二种情况里,在delete之后指针就变成了了人们所说的空悬指针(dangling pointer),指向一块曾经保存数据对象现在已经无效的内存测指针。

1 0
原创粉丝点击