(GeekBand或极客班) 你的内存泄漏了--- 之 virtual 析构
来源:互联网 发布:炉石传说mac版下载 编辑:程序博客网 时间:2024/06/15 05:18
在这次作业点评中发现很多同学都没有在基类的析构函数使用virtual。
这在类的继承中是非常危险的。因为你的析构没有正确的调用,你的内存可能在不断的泄漏。。。
下面用一个小实验测试一下吧。
下面先给出测试代码:
Demo.h
#ifndef __DEMO_H__#define __DEMO_H__#include <iostream>class IBase1{public:IBase1() {std::cout<<"执行了 IBase1 的构造函数"<<std::endl;};~IBase1() {std::cout<<"执行了 IBase1 的析构函数"<<std::endl;};};class IBase2{public:IBase2() {std::cout<<"执行了 IBase2 的构造函数"<<std::endl;};virtual ~IBase2() {std::cout<<"执行了 IBase2 的析构函数"<<std::endl;};};class IDerive1 : public IBase1{public:IDerive1() {std::cout<<"执行了 IDerive1 的构造函数"<<std::endl;};~IDerive1() {std::cout<<"执行了 IDerive1 的析构函数"<<std::endl;};};class IDerive2 : public IBase2{public:IDerive2() {std::cout<<"执行了 IDerive2 的构造函数"<<std::endl;};~IDerive2() {std::cout<<"执行了 IDerive2 的析构函数"<<std::endl;};};#endifmain.h
#include <iostream>#include "Demo.h"int main(){std::cout<<"------------------------测试非虚析构"<<std::endl;IBase1* p1 = new IDerive1();delete p1;std::cout<<"------------------------测试虚析构"<<std::endl;IBase2* p2 = new IDerive2();delete p2;return 0;}这里写了2个基类,一个是虚析构, 一个不是虚析构。在面向对象的程序中。使用父类指针指向子类对象是很正常。但是对这个指针delete时,使用非虚析构函数就会出现问题。
下面运行代码:
$ ./debug.exe------------------------测试非虚析构执行了 IBase1 的构造函数执行了 IDerive1 的构造函数执行了 IBase1 的析构函数------------------------测试虚析构执行了 IBase2 的构造函数执行了 IDerive2 的构造函数执行了 IDerive2 的析构函数执行了 IBase2 的析构函数
结果很明显,非虚析构的父类指针在delete的时候,并没有执行子类的析构函数。可以想象如果我们子类中有我们动态申请的内存,或者文件资源需要释放,那么这些资源的的释放就会被忽略了。
结论:如果一个类在以后的使用中可能成为基类,就使用virtual析构。
0 0
- (GeekBand或极客班) 你的内存泄漏了--- 之 virtual 析构
- (GeekBand或极客班) inline 函数的思考。
- (GeekBand或极客班)对象的生命周期小实验。
- Geekband作业12--寻找内存泄漏
- 亲爱的,内存泄漏了
- (GeekBand或极客班) inline 函数的思考。(第二季)
- (GeekBand或极客班)inline 函数到底写在哪?
- (GeekBand或极客班)简单对象构造过程分析。
- 可能你不知道的内存泄漏
- 你使用Rxjava时,内存泄漏了吗?
- IE6出了内存泄漏的补丁
- 内存泄漏之CFormView 中使用 OLE (或 .net com) 控件后发生内存泄漏
- 内存溢出和内存泄漏的区别,今天被问蒙了。。。
- app开发过程中内存泄漏一些简述_懂了这些你的app还在闪退么?
- android或 java内存泄漏需要注意的地方
- ClosedXML 内存泄漏或OutOfMemory错误的原因
- 内存泄漏 之 MAT工具的使用
- 内存泄漏的问题之av_bitstream_filter_filter
- leetcode 172 Factorial Trailing Zeroes C++
- 继承
- 最全电商分类信息(08)
- RadioGroup+ViewPager+Fragment+滚动条
- 最全电商分类信息(09)
- (GeekBand或极客班) 你的内存泄漏了--- 之 virtual 析构
- Packet for query is too large(mysql查询数据过大)
- 【NodeJs】Linux安装NodeJs并配合Nginx实现反向代理
- 深入理解JS异步编程二(分布式事件)
- 最全电商分类信息(10)
- CSS块级元素、内联元素
- eclipse 修改后台代码
- String 类型 保留后两位小数
- python3深入学习教程