Virtual destruct(虚析构函数)

Posted yekko

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Virtual destruct(虚析构函数)相关的知识,希望对你有一定的参考价值。

Virtual destruct(虚析构函数)

面试的时候,我答了虚函数是怎么工作的,但是当面试官问我为什么析构函数的基类一定需要virtual时候,我答的不是太好,所以来总结下
先说结论,当基类的指针指向子类的对象时,如果delete此指针,如果基类没有virtual析构函数,那么调用时只会调用基类的析构函数,而子类的空间未释放。
如以下例子


class BaseClass
{
private:
    int *m_Basepointer;
public:
    BaseClass() { std::cout << "it's Base Construct!" << std::endl; }
    ~BaseClass()
    {
        delete m_Basepointer;
        std::cout << "it's Base Deconstruct!" << std::endl;
    }
};

class SubClass:public BaseClass
{
public:
    SubClass() { std::cout << "it's Sub Construct!" << std::endl; }
    ~SubClass() 
    {
        std::cout << "it's Sub Deconstruct!" << std::endl;
    }

};

int main()
{
    BaseClass *p_b = new BaseClass;
    delete p_b;
    std::cout << "---------------------------------
";
    SubClass *p_s = new SubClass;
    delete p_s;
    std::cout << "---------------------------------
";
    BaseClass *p_b_s = new SubClass;
    delete p_b_s;

    std::cin.get();
}

技术图片
从如上例子可以看出子类的析构函数未被调用,此时造成内存泄露。但是在基类加上virtual后,如下


#include<iostream>

class BaseClass
{
private:
    int *m_Basepointer;
public:
    BaseClass() { std::cout << "it's Base Construct!" << std::endl; }
    virtual ~BaseClass()
    {
        delete m_Basepointer;
        std::cout << "it's Base Deconstruct!" << std::endl;
    }
};

class SubClass:public BaseClass
{
public:
    SubClass() { std::cout << "it's Sub Construct!" << std::endl; }
    ~SubClass() 
    {
        std::cout << "it's Sub Deconstruct!" << std::endl;
    }

};

int main()
{
    BaseClass *p_b = new BaseClass;
    delete p_b;
    std::cout << "---------------------------------
";
    SubClass *p_s = new SubClass;
    delete p_s;
    std::cout << "---------------------------------
";
    BaseClass *p_b_s = new SubClass;
    delete p_b_s;

    std::cin.get();
}

技术图片

成功释放,这就是为何要在基类加上virtual防止内存泄露,保证安全释放。

以上是关于Virtual destruct(虚析构函数)的主要内容,如果未能解决你的问题,请参考以下文章

通过C++编译视频平台为什么要使用virtual虚析构函数?

C++中基类的析构函数为什么要用virtual虚析构函数

C++中基类的析构函数为什么要用virtual虚析构函数

虚析构函数与纯虚函数

-Wnon-virtual-dtor持有虚函数却不是虚析构

虚析构函数(c++常问问题五)