什么时候需要虚析构函数
2009-02-20 15:00
295 查看
| |||||
答案:当你的类准备给别人继承时要提供虚析构函数 考虑下面例子: class A { public: A(){cout << "In A constructor" << endl;} ~A(){cout << "In A destructor" << endl;} }; class B : public A { public: B() { cout << "In B constructor" << endl; m_p = new char[10]; } ~B() { cout << "In B destructor" << endl; if (m_p) delete [] m_p; } private: char *m_p; }; int main(int argc, char* argv[]) { //printf("Hello World!/n"); A *p = new B; delete p; return 0; } 输出结果: In A constructor In B constructor In A destructor 并没有调用B的析构函数,new出来的内存没有及时回收造成内存泄漏。 要解决这个问题,只要将A的析构函数定义为虚函数:~A(){cout << "In A destructor" << endl;}。为什么定义为虚函数就能解决呢?我是这样理解的: 象其它虚构函数一样,~B()重定义(overridden)了~A(),这样指向派生类的指针就能根据运行时的状态调用B的析构函数了。这里又有一个问题:为什么还会调用A的析构函数呢?我只能理解为析构函数是一个特殊的函数,由系统维护其机制。就像B.~A()是错误而B.~B()(虽然逻辑上不对,但语法上是正确的,编译运行完全没问题)是正确的一样。 Any idea for this? 作者Blog:http://blog.csdn.net/jackieyoung/ 相关文章
|
|
相关文章推荐
- C++ 虚析构函数 和动态联编有关 什么时候需要虚析构函数?
- 什么时候需要虚析构函数
- 什么时候需要虚析构函数
- 什么情况下指针需要使用malloc分配内存,什么时候不需要
- 什么时候需要定义拷贝构造函数
- 什么时候需要重建索引
- 什么时候需要将析构函数定义为虚函数,如果不这么做,会存在什么问题?
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- iOS 面试题(4.):block 什么时候需要构造循环引用
- 有类成员时,什么时候可以前置声明.什么时候需要#include .
- 什么时候开发人员需要PHP框架
- IMS/SIP - Invite消息里的Cseq的作用以及什么时候需要增1?
- 什么时候需要重写equals方法
- 在什么时候需要使用“常引用”?
- 什么是否声明为虚析构函数 什么时候不声明为虚析构函数
- 为什么要在linux命令前加上 ./ 什么时候才需要在命令前加上./
- 什么时候需要用到RCC_APB2Periph_AFIO--复用IO时钟的使用
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- 【IOS学习】到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- DFS回溯标记什么时候需要还原