码迷,mamicode.com
首页 > 其他好文 > 详细

Virtual destruct(虚析构函数)

时间:2020-03-18 13:29:48      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:总结   图片   内存   vat   对象   工作   析构   cpp   http   

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 << "---------------------------------\n";
    SubClass *p_s = new SubClass;
    delete p_s;
    std::cout << "---------------------------------\n";
    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 << "---------------------------------\n";
    SubClass *p_s = new SubClass;
    delete p_s;
    std::cout << "---------------------------------\n";
    BaseClass *p_b_s = new SubClass;
    delete p_b_s;

    std::cin.get();
}

技术图片

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

Virtual destruct(虚析构函数)

标签:总结   图片   内存   vat   对象   工作   析构   cpp   http   

原文地址:https://www.cnblogs.com/Yekko/p/12516539.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!