为什么要将一个父类的析构函数写成一个虚函数,和内存泄漏有关,怎么理解?
来源:互联网 发布:上海行知小学对口中学 编辑:程序博客网 时间:2024/06/05 06:02
今天被一个问题困扰了一下,当我们定义了一个类,然后在让一个子类去继承这个类,定义子类和父类都写好构造函数和析构函数,实例化这个子类对象时,会先调用父类的构造函数,在调用子类的构造函数,释放这个对象的时候恰恰相反 ,先调用子类析构函数,在调用父类析构函数,那么,问题就是存在这种继承机制的类是否会额外消耗很多的存储空间呢?比如说一个类,继承多个父类或者说链式继承,即他的父类还继承了别的类,那么示例化一个子类对象难道说要将他的所有父类都实例化?期待高手回答这个问题,相信还有很多人对这个不是很理解,固然大家知道不可能将所有的父类都实例化,但是,子类必然包含有父类的相关信息,是简单的复制,还是压栈式的融合,我对此表示还不清楚,因此不敢妄加评论,希望高手能解答。
好了,继续我要说的问题,那么,如果以指针形式声明一个基类类型指针,然后调用子类构造函数为其构建对象,当释放对象的时候,是调用父类析构函数还是调用子类析构函数呢?看下面的例子;
函数的返回结果是:
可以看到值调用了父类的析构函数,而子类的析构函数没有被调用,那么可想而知,如果在子类的构造函数中对某个成员函数在堆空间中分配了空间,而之类没有被调用,是不是会造成内存泄漏呢?答案是肯定的,那有什么办法可以解决这种情况下出现的内存泄漏呢?那就是把父类的析构函数写为虚函数,看下面的代码:
运行结果:
因此,在写父类的时候,最好将其析构函数写为虚函数。这样可以防止比较瘾避的内存泄漏。
转自: 为什么要将一个父类的析构函数写成一个虚函数,和内存泄漏有关,怎么理解? - 做一个道者 - 博客频道 - CSDN.NET
http://blog.csdn.net/bravekingzhang/article/details/6436366
- 为什么要将一个父类的析构函数写成一个虚函数,和内存泄漏有关,怎么理解?
- 为什么要将一个父类的析构函数写成一个虚函数,和内存泄漏有关,怎么理解?
- 析构函数为什么要写成虚函数
- C++:析构函数写成虚函数是干什么用的,为什么要这么写?
- 只有当一个类被用来作为基类的时候,才把析构函数写成虚函数.
- 关于为什么要为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
- 一个有关C++中对象构造、析构和虚函数的问题
- C++中析构函数为什么要写成虚函数
- 为什么C++基类析构函数写成虚函数
- 为什么CBase有一个 公共 的 虚 析构函数
- 析构函数为什么一定写成虚函数的形式 http://blog.sina.com.cn/s/blog_4b146a9c0100sgyg.html
- 把类的析构函数写成虚函数的用意
- 把类的析构函数写成虚函数的用意
- 把类的析构函数写成虚函数的用意
- 基类的析构函数需不需要写成虚函数
- 5.理解“抛出一个异常”,“传递一个参数”和“调用一个虚函数”间的差异
- 模板类成员函数的定义和声明为什么要放在一个文件中
- 模板类成员函数的定义和声明为什么要放在一个文件中
- java-字符串中的字符进行排序
- 虚函数、纯虚函数、虚函数与析构函数
- C++动态库中调用sqlcipherbd.dll
- Oracle无法删除当前连接用户,以及killed的处理
- Activity启动过程
- 为什么要将一个父类的析构函数写成一个虚函数,和内存泄漏有关,怎么理解?
- 《Java150道面试题全集》
- 循环再体验
- 开启ESXi Shell或SSH后ESXi出现警告的解决方法
- c和c++的区别
- Javascript基础知识
- Spring-boot JDBC with multiple DataSources sample
- 多态
- 微服务(Microservice)那点事