把类的析构函数写成虚函数的用意
来源:互联网 发布:雷电抢购软件 编辑:程序博客网 时间:2024/05/21 08:53
输出结果只有:Base::Destruction
以上代码会产生内存泄露,因为new出来的是Derived类资源,采用一个基类的指针来接收,析构的时候,编译器因为只是知道这个指针是基类的,所以只将基类部分的内存析构了,而不会析构子类的,就造成了内存泄露,如果将基类的析构函数改成虚函数,就可以避免这种情况,因为虚函数是后绑定,其实就是在虚函数列表中,析构函数将基类的析构函数用实际对象的一组析构函数替换掉了,也就是先执行子类的虚函数再执行父类的虚函数,这样子类的内存析构了,父类的内存也释放了,就不会产生内存泄露。
应该为
#include <iostream.h>class Base { public: Base() { mPtr = new int; } virtual ~Base() { delete mPtr; cout<<"Base::Destruction"<<endl;} private: int* mPtr; } ;class Derived : public Base { public: Derived() { mDerived = new long; } ~Derived() { delete mDerived; cout<<"Derived::Destruction"<<endl;} private: long* mDerived; } ;void main() { Base* p = new Derived; delete p; }
注:
1.析构函数其实是一个函数,不论子类还是父类,虽然可能看起来名字不一样。而且析构函数执行过程都是执行子类再到父类。
2.多态的时候一定要将析构函数写成虚函数,防止内存泄露,各个子类维护自己内部数据释放。
virtual 是实现多态的基础
它使得具体的函数跳转从编译时推迟到运行时然而构造函数的调用是编译器期间就决定的,因此它不能为虚
它使得具体的函数跳转从编译时推迟到运行时然而构造函数的调用是编译器期间就决定的,因此它不能为虚
- 把类的析构函数写成虚函数的用意
- 把类的析构函数写成虚函数的用意
- 把类的析构函数写成虚函数的用意
- 只有当一个类被用来作为基类的时候,才把析构函数写成虚函数.
- Sleep函数的真正用意
- 基类的析构函数需不需要写成虚函数
- c++中基类写成虚函数的作用
- PHP中,如果想使用静态调用函数又不想把类的方法写成静态
- C++:析构函数写成虚函数是干什么用的,为什么要这么写?
- 【面经笔记】析构函数一般写成虚函数的原因
- 为什么要将一个父类的析构函数写成一个虚函数,和内存泄漏有关,怎么理解?
- 为什么要将一个父类的析构函数写成一个虚函数,和内存泄漏有关,怎么理解?
- 析构函数为什么要写成虚函数
- 析构函数为什么一定写成虚函数的形式 http://blog.sina.com.cn/s/blog_4b146a9c0100sgyg.html
- 机器学习中损失函数常用log的用意
- S函数初识(m文件写成的S函数)
- 父类析构函数写成虚函数防止隐蔽的内存泄露问题
- 误把main()函数写成mian()函数竟然通过编译
- Xcode运行时错误:Could not launch "*.app"--No such file or directory(Users/*/Library/...)
- C++和C的源码混合使用需要了解的事
- STM32 定时器
- NSFetchedResultsController和UITableView显示CoreData的数据时用relationship分组的方 ...
- STM32 ADC
- 把类的析构函数写成虚函数的用意
- iphone--使将对象加入NSMutableArray中 引用计数不加1
- jsp运行原理浅析
- ubuntu-12.0.4 svn ,bugzilla 整合
- LoggedFS记录所有文件篡改情况
- C++ assert()函数的使用方法
- 关于ios异步加载图片的几个开源项目
- magento添加产品[有quote/无quote]
- ecshop在ie9下商品页标签不切换