C++虚析构函数可以防止内存泄漏
示例程序
#include <iostream>
#include <string>
using namespace std;
class Base1
{
public:
Base1()
{
cout << "Base1()" << endl;
}
~Base1()
{
cout << "~Base1()" << endl;
}
};
class Base2
{
public:
Base2()
{
cout << "Base2()" << endl;
}
virtual ~Base2()
{
cout << "~Base2()" << endl;
}
};
class Derived1:public Base1
{
public:
Derived1()
{
name=new string("NULL");
cout<<"Derived1()"<<endl;
}
Derived1(const string& n)
{
name=new string(n);
cout<<"Derived1()"<<endl;
}
~Derived1()
{
delete name;
cout << "Derived1 has been deleted." << endl;
}
private:
string* name;
};
class Derived2:public Base2
{
public:
Derived2()
{
name=new string("NULL");
cout<<"Derived2()"<<endl;
}
Derived2(const string& n)
{
name=new string(n);
cout<<"Derived2()"<<endl;
}
~Derived2()
{
delete name;
cout << "Derived2 has been deleted." << endl;
}
private:
string *name;
};
int main(void)
{
Base1* b1=new Derived1();
Base2* b2=new Derived2();
delete b1;
delete b2;
return 0;
}
输出结果
Base1()
Derived1()
Base2()
Derived2()
~Base1()
Derived2 has been deleted.
~Base2()
可以看到输出结果中,只调用了Base1的析构函数,但没有调用Derived1的析构函数,此时Derived1的部分内存并没有被释放,因此造成内存泄露。
将基类的析构函数改为虚函数,再用基类指针指向派生类对象时可以调用派生类对象的析构函数。