#include <iostream.h>
class Base
{
public:
Base() { mPtr = new int; }
~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;
}
输出结果只有:Base::Destruction
以上代码会产生内存泄露,因为new出来的是Derived类资源,采用一个基类的指针来接收,析构的时候,编译器因为只是知道这个指针是基类的,所以只将基类部分的内存析构了,而不会析构子类的,就造成了内存泄露,如果将基类的析构函数改成虚函数,就可以避免这种情况,因为虚函数是后绑定,其实就是在虚函数列表中,析构函数将基类的析构函数用实际对象的一组析构函数替换掉了,也就是先执行子类的虚函数再执行父类的虚函数,这样子类的内存析构了,父类的内存也释放了,就不会产生内存泄露。
注:
1.析构函数其实是一个函数,不论子类还是父类,虽然可能看起来名字不一样。而且析构函数执行过程都是执行子类再到父类。
2.多态的时候一定要将析构函数写成虚函数,防止内存泄露,各个子类维护自己内部数据释放。
virtual 是实现多态的基础
它使得具体的函数跳转从编译时推迟到运行时然而构造函数的调用是编译器期间就决定的,因此它不能为虚
分享到:
相关推荐
虚析构函数示例 c++析构函数是否是虚函数时的差别,敬请留意
C++中析构函数定义成虚函数的原因 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/SearchLife/archive/2009/03/12/3985341.aspx
析构函数也是以类名作为函数名,与构造函数不同的是在函数名前添加一个“~”符号,标识该函数是析构函数。析构函数没有返回值,甚至void类型也不可以,析构函数也没有参数,因此析构函数是不能够重载的。这是析构...
构造函数不能声明为虚函数,析构函数可以声明为虚函数。
本文给大家分享了避免析构函数调用虚函数。
我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:
该资源的内容主要是 虚基类 虚函数成员 虚析构函数的具体的区别
详细解释了为什么析构函数可以是虚函数,而构造函数不能是虚函数
析构函数 finalizer destructor 整理的关于析构函数的描述以及介绍
C++中基类的析构函数为什么要用virtual虚析构函数.pdf
深析C++析构函数,C++中析构函数是相当重要一个知识点,也是个难点。文档对析构函数了部分分析,可能不怎么全,但一点深入,相互学习呵呵
简单示例如何使用析构函数 包括析构函数的位置 作用方法等
析构函数用于析构类的实例。 备注 不能在结构中定义析构函数。只能对类使用析构函数。 一个类只能有一个析构函数。 无法继承或重载析构函数。 无法调用析构函数。它们是被自动调用的。 析构函数既没有修饰符,也没有...
实验_构造函数与析构函数.doc实验_构造函数与析构函数.doc实验_构造函数与析构函数.doc
c#构造函数与析构函数.doc
delphi析构函数的使用,以及窗体的继承,多态。
c++ 练习 析构函数 例子 初级,书上的一个例子
自己下的一个调用派生析构函数的程序,希望大家互相学习啊。
当析构函数遇到多线程