C++ delete陷阱
来源:互联网 发布:fdd网络 编辑:程序博客网 时间:2024/06/16 05:58
C++ delete陷阱
可能算不上陷阱这么严重,或者我可能危言耸听什么的,但这个确实是之前没有注意到的一个问题,最近一个小项目中确实吃了不少苦头。
我们知道,在C++ 动态内存操作的过程中,对于不再使用的分配过的内存一定要用delete
来释放,简单的用法可以这么来说:
new
和delete
是成对出现,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
- delete和delete[]陷阱
- GDI+ 中 delete 陷阱
- C++ delete陷阱
- 多线程多核的delete陷阱
- C“陷阱”
- C ++ delete 和delete[]
- {c++}delete与delete[]
- [C++] 关于delete和delete[]
- C++delete和delete[]区别
- 【C++】new delete & new[] delete[]
- c陷阱与缺陷
- 小心陷阱--% of C
- C陷阱和缺陷
- C陷阱(一)
- C陷阱(二)
- C陷阱&缺陷-笔记
- C语言陷阱
- c 语言陷阱
- Spring MVC
- Top Things to do After Installing Ubuntu 13.04 Raring Ringtail
- 【线段树】线段树入门之入门
- OpenCV版本问题带来的困扰
- apache2.2修改服务可执行路径
- C++ delete陷阱
- Mac OS 安装Wget
- Application.Run() form.show form.showdialog
- logcat日志自动消失
- Battery Historian 2.0 for windows环境搭建
- JS中的“!!”
- 数据结构(寒假小结)——2.1线性表之顺序表
- c——字符数组
- 灰色预测模型