精华内容
下载资源
问答
  • 虚析构函数的作用
    2016-08-09 14:06:06
    我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:    
        有下面的两个类:




    class ClxBase
    {
    public:
        ClxBase() {};
        virtual ~ClxBase() {};


        virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
    };


    class ClxDerived : public ClxBase
    {
    public:
        ClxDerived() {};
        ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; 


        void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
    };


        代码




    ClxBase *pTest = new ClxDerived;
    pTest->DoSomething();
    delete pTest;


        的输出结果是:


    Do something in class ClxDerived!
    Output from the destructor of class ClxDerived!


        这个很简单,非常好理解。
        但是,如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:


    Do something in class ClxDerived!


        也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。
    我想所有的C++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
        所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
        当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。
    所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数
    更多相关内容
  • 主要介绍了C++中虚析构函数作用及其原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • C++ 虚析构函数作用

    2019-11-30 23:27:28
    那么虚析构函数作用:就是释放派生类的内存,防止内存泄漏。 实例: 第一种情况,当没有虚析构函数时: // VirtualDemo.cpp : 定义控制台应用程序的入口点。 // 虚析构函数使用 #include "stdafx.h" #include &...
    • 简单的来说,虚函数的作用是当基类调用派生类的对象时,能够实现多态,即虚函数会优先调用派生类的对应函数。
    • 那么虚析构函数的作用:就是释放派生类的内存,防止内存泄漏。
      实例:
    • 第一种情况,当没有虚析构函数时:
    // VirtualDemo.cpp : 定义控制台应用程序的入口点。
    // 虚析构函数使用
    
    #include "stdafx.h"
    #include <memory>
    #include <iostream>
    using namespace std;
    
    class A{
    public:
    	A(){
    		cout << "A Init()" << endl;
    	}
        ~A(){
    		cout << "A Destroy()" << endl;
    	}
    };
    
    class B:public A{
    public:
    	B(){
    		cout << "B init()" << endl;
    	}
    	~B(){
    		cout << "B destroy()" << endl;
    	}
    };
    
    void test()
    {
    	unique_ptr<A> demo(new B());
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	test();
    	system("pause");
    	return 0;
    }
    
    
    

    运行结果:
    在这里插入图片描述
    可以发现,只释放了A的内存,B的析构函数没有被调用

    • 接下来是添加虚析构函数的代码
    // VirtualDemo.cpp : 定义控制台应用程序的入口点。
    // 虚析构函数使用
    
    #include "stdafx.h"
    #include <memory>
    #include <iostream>
    using namespace std;
    
    class A{
    public:
    	A(){
    		cout << "A Init()" << endl;
    	}
        virtual ~A(){
    		cout << "A Destroy()" << endl;
    	}
    };
    
    class B:public A{
    public:
    	B(){
    		cout << "B init()" << endl;
    	}
    	~B(){
    		cout << "B destroy()" << endl;
    	}
    };
    
    void test()
    {
    	unique_ptr<A> demo(new B());
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	test();
    	system("pause");
    	return 0;
    }
    
    
    

    运行结果:
    在这里插入图片描述
    可以看出,此时B的析构函数也被调用,至于为什么也被调用,那就是虚函数表的作用,这个和虚函数的原理是一摸一样的,在此,不继续赘述了。能明白就还好~


    重点:
    只针对需要作为基类的包含虚函数的类才添加虚析构函数,其他的东西 添加纯属扯淡。

    虚函数表在编译的时候就确定了,而类对象的虚函数指针vptr是在运行阶段确定的,这是实现多态的关键!

    展开全文
  • 析构函数作用是当对象生命期结束后,收回对象占用的资源,析构函数的特点是: 1、析构函数名是在类名前加以符号“~”。 2、析构函数没有参数、返回类型和修饰符。 3、一个类中至多有一个析构函数,如果程序员...
  • 本篇文章是对C++中虚析构函数作用进行了详细的分析介绍,需要的朋友参考下
  • 虚析构函数作用

    千次阅读 2020-08-28 11:13:17
    总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露...

    总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露的。

    #include<iostream>
    using namespace std;
    class A{
    	public :
    	A(){
    		cout<<"construct A"<<endl;
    	} 
    	 ~A(){
    		cout<<"destruct A"<<endl;
    	}
    };
    class B  : public A {
    	public:
    	B(){
    		cout<<"construct B"<<endl;
    	}
    	 ~B(){
    		cout<<"destruct B"<<endl;
    	}
    };
    int main(){
    	A *p=new B;
    	delete p;
    	return 0;
    } 
    

    输出结果如下,在删除指向派生类对象的的指针p时,没有调用派生类B的析构函数,这样就会造成内存泄漏。
    在这里插入图片描述

    class A{
    	public :
    	A(int i=0){
    		cout<<"construct A"<<endl;
    	} 
    	 virtual ~A(){
    		cout<<"destruct A"<<endl;
    	}
    };
    

    将上述代码基类A中的构造函数改为虚析构函数后,输出结果如下所示,
    在删除基类指针的时候,会先调用派生类的析构函数,再调用基类的虚析构函数,这样就不会造成内存泄漏了。
    在这里插入图片描述

    展开全文
  • 事实上,虚析构函数,就是虚的析构函数,也就是析构函数具有了虚函数的性质。在C++开发中,用来做基类的类的析构函数一般都是虚函数,为什么要这样做,下面来进行以下说明:下面程序中定义两个类,公有继承:class ...

      事实上,虚析构函数,就是虚的析构函数,也就是析构函数具有了虚函数的性质。

    在C++开发中,用来做基类的类的析构函数一般都是虚函数,为什么要这样做,下面来进行以下说明:

    下面程序中定义两个类,公有继承:

    class ClxBase
    {
    public:
        ClxBase() {};
        virtual ~ClxBase() {};
    
        virtual void DoSomething() 
    { 
    cout << "Do something in class ClxBase!" << endl; 
    };
    };
    
    class ClxDerived : public ClxBase
    {
    public:
        ClxDerived() {};
        ~ClxDerived() 
    { 
    cout << "Output from the destructor of class ClxDerived!" << endl;
     }; 
    
        void DoSomething() 
    { 
    cout << "Do something in class ClxDerived!" << endl; 
    };
    };

    主程序部分代码:

    ClxBase *pTest = new ClxDerived;
    pTest->DoSomething();
    delete pTest;

    程序运行结果如下:

    Do something in class ClxDerived!
    Output from the destructor of class ClxDerived!

     这个很简单,非常好理解。但是,如果把类ClxBase析构函数前的virtual去掉,输出结果就发生变化了。

    改变之后结果如下:

    Do something in class ClxDerived!

    也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。这种情况下的编程是很危险的。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。


     所以,文章开头的那个问题的答案就是这样做是为了当用一个基类的指针删除一个派生类的对象时,使用了virtual即把析构函数写成虚析构函数,派生类的析构函数会被调用。    
        当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

    展开全文
  • C++中虚析构函数作用及其原理分析

    万次阅读 多人点赞 2017-03-15 00:13:04
    C++中的虚析构函数到底什么时候有用的,什么作用呢。 一.虚析构函数作用 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的...
  • 析构函数和虚析构函数析构函数虚析构函数 析构函数 析构函数与构造函数对应,当对象结束其生命周期,系统会自动执行析构函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。 ...
  • 1、类中所有的成员函数都是纯虚函数,2、没有定义成员变量。 因为接口只负责描述类的行为和功能,不需要实现,而是由它的派生类来实现。 至于普通抽象类,只要有一个成员函数被声明为纯虚函数,那它就是抽象类,这...
  • c++ 虚析构函数作用

    2021-02-04 13:12:47
    当删除一个对象时,首先调用该派生类的析构函数,然后调用上一层基类的析构函数,依次类推,直到到达最顶层的基类的析构函数为止。 简单的说,构造函数是“自上向下”调用,析构函数是“自下而上”调用。 构造函数的...
  • c++虚析构函数作用

    2018-05-13 12:11:36
    虚析构函数作用 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的...
  • 虚析构函数作用: 析构函数是可以声明为虚函数的,如果基类指针指向一个new生成的派生类对象,通过delete作用于基类指针删除派生类对象时,有以下两种情况: 如果基类析构函数不为虚析构函数,则只会调用基类的析...
  • 虚析构函数有啥用? 先测测你哟,上代码????: #include<iostream> using namespace std; class Base //父类(基类) { public: Base() { cout << "Base构造函数!" << endl; } ~Base() { ...
  • 简述虚析构函数与纯虚析构函数

    千次阅读 2019-03-25 19:56:51
    基础知识: C++中,一个类在建成时...即使析构函数不被声明,也会隐式调用析构函数。 那么,当一个派生类继承了一个基类,这时候调用析构函数,会发生什么呢? #include <iostream> using namespace std;...
  • C++之虚析构函数

    2019-03-17 14:37:08
    顾名思义,虚析构函数就是给析构函数声明为 virtual。 作用 虚析构函数可以正常的销毁多态模式下的派生类对象,防止造成一个诡异的“局部销毁”对象,从而防止形成内存泄漏。 使用场景 带有多态性质的基类应该声明...
  • 虚析构函数

    2019-09-07 18:11:21
    C++中的虚析构函数到底什么时候有用的,什么作用呢。 一.虚析构函数作用 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类...
  • C++虚析构函数

    2020-06-14 11:29:41
    1、虚析构函数作用:避免内存泄漏。 使用虚析构函数在删除指向子类对象的基类指针时,可以调用子类的析构函数使子类占用的堆内存释放,从而防止内存泄漏。 2、使用总结 (1)在基类的析构函数前加上virtual...
  • #include using namespace std;class Base{ public: Base(){}; ~Base(){ cout这是Base类的析构函数"; }; virtual void DoSomething(){ cout这是Base类的DoSomething"<<en

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,319
精华内容 12,127
关键字:

虚析构函数的作用