虚析构函数和非虚析构函数对资源释放的不同
- 非虚析构函数:
- 当使用基类指针指向派生类对象,然后通过基类指针删除对象时,如果基类析构函数不是虚函数,那么只会调用基类的析构函数,而不会调用派生类的析构函数。这可能导致派生类中分配的资源无法释放,从而产生内存泄漏等资源未释放问题。
- 虚析构函数:
- 当基类析构函数声明为虚函数时,通过基类指针删除派生类对象,会首先调用派生类的析构函数,然后再调用基类的析构函数。这样能确保派生类和基类中分配的资源都能正确释放。
代码示例
#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;
}
- 非虚析构函数情况:如果基类
Base
的析构函数是非虚的,运行上述代码,只会输出Base class destructor
,派生类Derived
中分配的data
内存不会被释放。
- 虚析构函数情况:当基类
Base
的析构函数声明为虚函数时,运行代码会先输出Derived class destructor
,再输出Base class destructor
,派生类中的data
内存会被正确释放。