C++析构函数

66 阅读1分钟

1.主题:

c++中为什么要使用虚析构函数

2.场景复现:

 涉及到多态时,我们常用基类指针指向子类对象
 使用完毕后调用 delete p释放

3. 问题

delete p调用后执行的是基类的析构函数
假如我们在子类中使用了其他资源,就会导致内存泄漏

4.解决方法:

基类的析构函数增加 virtual 关键字

5.验证:

#include <iostream>
class Base
{
public:
   ~Base()
    {
        std::cout << "Base" << std::endl;
    }
};

class Drived : public Base
{
public:
    ~Drived()
    {
        std::cout << "Drived" << std::endl;
    }
};

int main()
{
    {

        Base *base = new Drived();
        delete base;
    }
}

输出:

image.png

#include <iostream>
class Base
{
public:
    virtual ~Base()
    {
        std::cout << "Base" << std::endl;
    }
};

class Drived : public Base
{
public:
    ~Drived()
    {
        std::cout << "Drived" << std::endl;
    }
};

int main()
{
    {

        Base *base = new Drived();
        delete base;
    }
}

输出:

image.png

6.原因:

动态绑定范畴,后面在单独讲一下