c++ 虚析构函数[避免内存泄漏]

c++  虚析构函数:

虚析构函数
(1)虚析构函数即:定义声明析构函数前加virtual 修饰, 如果将基类的析构函数声明为虚析构函数时,
由该基类所派生的所有派生类的析构函数也都自动成为虚析构函数。

(2)基类指针pbase 指向用new动态创建的派生类对象child时,用“delete pbase;”删除对象分两种情况:
第一,如果基类中的析构函数为虚析构函数,则会先删除派生类对象,再删除基类对象
第二,如果基类中的析构函数为非虚析构函数,则只会删除基类对象,不会删除派生类对象,这样便出现了内存泄漏了

#include <iostream>
using namespace std;
#include <string>
////////////////////////////
class Base {
public:

#if  0
    virtual ~Base();// in Child::~Child()    in Base::~Base()
#else
     ~Base();        // in Base::~Base() 存在内存泄漏的危险
#endif
};

Base::~Base()
{
    cout<<"in Base::~Base()"<<endl;
}
////////////////////////////

class Child: public Base {
public:
    ~Child();
};

Child::~Child()
{
    cout<<"in Child::~Child()"<<endl;
}

int demo()
{
    Base *pc = new Child;
    cout<<"-----------"<<endl;
    delete pc;
    cout<<"-----------"<<endl;
    return 0 ;
}

int main() {
    demo();
    while(1);
    return 0;
}
时间: 2024-10-12 21:15:13

c++ 虚析构函数[避免内存泄漏]的相关文章

c++对象内存模型之虚析构函数篇(2)

现在讨论第二种情况: (第一种情况传送门,单独一个类,有虚析构函数,虚函数) (2)有继承关系,单一继承,父类无虚析构函数,子类有(子类没有就没必要说了) 这种情况让我相当晕,照例先贴代码 : 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 int ia; 7 public: 8 A ():ia(15) 9 { 10 } 11 ~A () 12 { 13 cout << "~A" &l

c++对象内存模型之虚析构函数篇(3)

经过前两篇的分析,说实话, 现在的我是比较晕的.但仍然坚持自己的学习方法,先自己“理所当然”的理解,再去求证官方说法.毕竟东西是别人定的,规则是别人的. 1 http://www.cnblogs.com/boota/p/4040310.html 2 http://www.cnblogs.com/boota/p/4043282.html 这次是讨论的情形是:有继承关系,单一继承,父类有虚析构函数.(子类有没有虚析构函数不影响,这个结论可以验证,就不另做讨论) 上代码: 1 #include <io

c++对象内存模型之虚析构函数篇(1)

看了两篇关于c++对象内存模型的文章,来源在这里: http://blog.csdn.net/haoel/article/details/3081328/ http://blog.csdn.net/haoel/article/details/3081385 文章中讲了多种继承模式中虚函数的实际情况,按我的理解是把单一继承理解好了,其它几种只是一种变种.当然没这文章,我断想不到c++对象内存是这个样子. 文章中讲的情况,唯独没有讲有虚析构函数存在的情形.我学着文章中介绍的方法,用试探的方式找有虚析

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能

C++虚析构函数

在类中,构造函数用于初始化对象及相关操作,构造函数是不能声明为虚函数的,因为在执行构造函数前对象尚未完成创建,虚函数表尚不存在,此时就无法去查询虚函数表,因此也就无法得知该调用哪一个构造函数了. 析构函数则用于销毁对象时完成相应的资源释放工作,析构函数可以被声明为虚函数.我们先通过一个例子来说明析构函数声明为虚函数的必要性. 例1: #include<iostream>using namespace std; class base{public: base(); ~base();private

【转】C++内存泄漏检查心得

摘要:本文简单介绍了C++编程时,大家经常犯得一些内存泄漏方面的编码错误,并给出简单的代码示例.并简要给出了Win32平台下使用检测内存泄漏利器DevPartner BoundsChecker进行检查以发现泄漏代码的详细步骤.值此党的节日,希望对一些迷失在内存泄漏中的同志们有所帮助避免少走弯路.我一直觉得党的党章是完美的,原则是好的,共产主义社会肯定比资本主义财富集中在少数人手里强,只是到了下面执行就有所欠缺了,这次上海闵行封顶房的倒塌正是没有一个良好监督机制的问题,官员参股房地产明显违背政府.

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数、抽象类、虚析构函数、动态创建对象

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数.抽象类.虚析构函数.动态创建对象 一.纯虚函数 1.虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 2.如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数 3.在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做 4.定义纯虚函数: class <类名> { virtual <类型> <函

C++中虚析构函数的作用 .

我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数.可是,为什么要这样做呢?下面用一个小例子来说明:        有下面的两个类: class ClxBase{public:    ClxBase() {};    virtual ~ClxBase() {}; virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };}; class Cl

C++中虚析构函数的作用 (转载)

转自:http://blog.csdn.net/starlee/article/details/619827 我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数.可是,为什么要这样做呢?下面用一个小例子来说明:        有下面的两个类: class ClxBase { public: ClxBase() {}; virtual ~ClxBase() {}; virtual void DoSomething() { cout << "Do something i