内存泄漏-Delete不调用析构函数的两种情况
2015-09-29 12:16
429 查看
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
1. 所使用的类为预定义类
下面这段函数代码编译运行时没有问题的,不需要CPtr的定义---PtrUser.h
class CPre; // 预定义 class CPtrUser { public: CPreUser():m_pPtr(null); { } ~CPreUser() { <span style="BACKGROUND-COLOR: #ffcc33"><strong>delete m_pPtr;</strong> </span> } void SetPtr(CPtr* p) { m_pPtr = p; } private: CPtr* m_pPtr; };
当在Main中使用时,delete时,我们或许认为 m_pPtr 的析构函数会被调用
---main.cpp
CPtrUser user = new CPtrUser(); user->SetPtr(xxx); <span style="BACKGROUND-COLOR: #ffcc99">delete user; </span>
但实际上,如果PtrUser.h先被包含的话,delete m_pPtr时,是不会调用CPtr析构函数的
如果期望析构函数被调用,可以把 CPtr的定义放入到PtrUser.h中,这样C++编译器就能识别该类型,编译时,为delete添加析构函数调用
2. 转为父类,而父类没有声明virtual的虚析构函数
Parent* p = new Child();delete p;
这种情况,Child的析构函数不会被调用。
class Parent { }; class Child : public Parent { public: Child() { } ~Child() { } }
要让被调用,可以简单修改为
class Parent { public: virtual ~Parent() { }; };
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
相关文章推荐
- iOS 9学习系列:上手SFSafariViewController
- win10boost中编译bjam问题中结构重定义
- VirtualBox内ubuntu10.10系统和windows7 共享文件夹
- 解决方法of未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
- Clojure第一天作业
- Numpy溢出
- JFreeChart从一个给定的业务数据创建条形图。
- JFreeChart中文乱码解决方案
- html5 音频和视频(audio And video)
- matlab初步学习1
- xml中控件调用构造方法
- 利用树莓派制作SOS求救灯
- android数字签名相关命令
- 希尔排序-Java
- ListView与SimpleCursorAdapter实现视频列表
- 黑马程序员—异常+IO流File类+Properties+PrinWriter+合并流+切割文件+对象序列化+管道流+RandomAccessFile+操作基本数据类型的DataStre
- Linux系统下使用split命令分割大文件
- 利用Piranha+LVS方案实现WEB负载均衡
- docker自定义ip
- Extjs--12种布局方式