MST

星途 面试题库

面试题:C++ 中虚析构函数如何保障资源释放

请阐述在 C++ 中,当存在继承关系时,使用虚析构函数和非虚析构函数对资源释放会有什么不同?并举一个简单的代码示例说明虚析构函数如何保障资源的正确释放。
24.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

虚析构函数和非虚析构函数对资源释放的不同

  1. 非虚析构函数
    • 当使用基类指针指向派生类对象,然后通过基类指针删除对象时,如果基类析构函数不是虚函数,那么只会调用基类的析构函数,而不会调用派生类的析构函数。这可能导致派生类中分配的资源无法释放,从而产生内存泄漏等资源未释放问题。
  2. 虚析构函数
    • 当基类析构函数声明为虚函数时,通过基类指针删除派生类对象,会首先调用派生类的析构函数,然后再调用基类的析构函数。这样能确保派生类和基类中分配的资源都能正确释放。

代码示例

#include <iostream>
using namespace std;

class Base {
public:
    // 非虚析构函数
    // ~Base() {
    //     cout << "Base class destructor" << endl;
    // }

    // 虚析构函数
    virtual ~Base() {
        cout << "Base class destructor" << endl;
    }
};

class Derived : public Base {
private:
    int* data;
public:
    Derived() {
        data = new int(10);
        cout << "Derived class constructor" << endl;
    }
    ~Derived() {
        if (data) {
            delete data;
            cout << "Derived class destructor" << endl;
        }
    }
};

int main() {
    Base* ptr = new Derived();
    delete ptr;
    return 0;
}
  1. 非虚析构函数情况:如果基类Base的析构函数是非虚的,运行上述代码,只会输出Base class destructor,派生类Derived中分配的data内存不会被释放。
  2. 虚析构函数情况:当基类Base的析构函数声明为虚函数时,运行代码会先输出Derived class destructor,再输出Base class destructor,派生类中的data内存会被正确释放。