关于多态里父类的析构函数造成子类内存泄露的问题
2014-03-18 17:42
387 查看
最近在学c++,学到多态,发现一个有趣的问题,先来看一段代码:
只需要看main函数里的,Database为父类,Access、SQLServer和Oracle都是继承了Database的子类,而Program为调用一个Database对象的类。之前new申请动态内存都没有问题,一直到调用结束,我们想用delete来释放内存空间的时候,结果显示为:
,怎么只释放了父类对象的空间而没有释放子类对象?这是因为没有在父类的析构函数前加上关键字
virtual,实际上,许多人的经验是,只要父类里定义了virtual的成员函数,则虚构函数几乎都需要加上virtual,我们把virtual加到父类的析构函数之前,再来看结果:
,这是一切正常了。
#include <iostream> using namespace std; class Database{ public: virtual void connect(){cout << "Database connected!" << endl;} virtual void query()const{cout << "Database queried!" << endl;} Database(){cout << "Database" << endl;} ~Database(){cout << "~Database" << endl;} }; class Access : public Database{ public: virtual void connect(){cout << "Access connected!" << endl;} virtual void query()const{cout << "Access queried!" << endl;} Access(){cout << "Access" << endl;} ~Access(){cout << "~Access" << endl;} }; class SQLServer : public Database{ public: virtual void connect(){cout << "SQLServer connected!" << endl;} virtual void query()const{cout << "SQLServer queried!" << endl;} SQLServer(){cout << "SQLServer" << endl;} ~SQLServer(){cout << "~SQLServer" << endl;} }; class Oracle : public Database{ public: virtual void connect(){cout << "Oracle connected!" << endl;} virtual void query()const{cout << "Oracle queried!" << endl;} Oracle(){cout << "Oracle" << endl;} ~Oracle(){cout << "~Oracle" << endl;} }; class Program{ public: void visit(Database* p){ p->query(); p->connect(); } Program(){cout << "Program" << endl;} ~Program(){cout << "~Program" << endl;} };
int main() { Database* q1 = new Access; Database* q2 = new SQLServer; Database* q3 = new Oracle; Program* p = new Program; p->visit(q1); p->visit(q2); p->visit(q3); delete q1; delete q2; delete q3; delete p; return 0; }
只需要看main函数里的,Database为父类,Access、SQLServer和Oracle都是继承了Database的子类,而Program为调用一个Database对象的类。之前new申请动态内存都没有问题,一直到调用结束,我们想用delete来释放内存空间的时候,结果显示为:
,怎么只释放了父类对象的空间而没有释放子类对象?这是因为没有在父类的析构函数前加上关键字
virtual,实际上,许多人的经验是,只要父类里定义了virtual的成员函数,则虚构函数几乎都需要加上virtual,我们把virtual加到父类的析构函数之前,再来看结果:
,这是一切正常了。
相关文章推荐
- 关于继承中子类和父类中构造函数和析构函数运行的顺序,和继承的多态
- 关于子类与父类的转换, 还有多态的说明 - 回复 "靳承柱" 和 "志成" 的问题
- 关于DB组件造成的内存泄露问题解析及解决
- 关于使用json库造成的内存泄露问题
- 关于一个内存泄露的问题
- 多线程 DLL 回调函数问题,当应用程序退出时,有些操作并未完成,造成程序内存泄露,如何解决呢
- 关于Scala子类继承父类属性的问题释疑---子类构造器参数不要与父类属性同名
- 关于子类调用父类构造方法的问题
- [Android] 关于WebView的内存泄露问题
- WCF-005:关于 WCF 基础连接已经关闭 连接被意外关闭-不是使用父类指向子类问题
- 关于Android中使用Handler造成内存泄露的分析和解决
- 关于创建子类对象的时候是否为父类的私有变量分配了内存
- 关于继承与构造函数重载的问题(初始化子类构造函数中的父类对象)求解答。。。
- 关于PHP中构造函数以及子类继承父类构造函数的相关问题
- Java关于子类对父类私有方法覆盖的问题
- 关于C++中子类调用父类方法的一个问题
- 关于内存泄露问题
- 关于WebView的内存泄露问题
- 关于block的回调使用-防止内存泄露问题
- Unity3D关于内存优化,内存泄露、多线程、引用C++的dll的问题研究