为了解决在多态情况下,delete父类指针不会调用子类析构函数,导致子类堆区数据释放不了的问题。
#include <iostream>
#include <string>
using namespace std;
class Animal
{
public:
Animal()
{
cout << "Animal中调用构造函数" << endl;
}
virtual void speak() = 0;
~Animal()
{
cout << "Animal中调用析构函数" << endl;
}
};
class Cat : public Animal
{
public:
Cat(string name)
{
cout << "Cat中调用构造函数" << endl;
m_Name = new string(name);
}
virtual void speak()
{
cout << *m_Name << "在说话" << endl;
}
string *m_Name;
~Cat()
{
if(m_Name != NULL)
{
cout << "Cat中调用析构函数" << endl;
delete m_Name;
m_Name = NULL;
}
}
};
void test01()
{
Animal * ani = new Cat("波斯猫");
ani->speak();
delete ani;
}
int main()
{
test01();
system("pause");
}
运行结果如下,可以看到cat的析构函数未被调用,导致内存泄漏。
修改基类析构函数为虚析构或纯虚析构函数可以解决上面的问题,代码如下:
#include <iostream>
#include <string>
using namespace std;
class Animal
{
public:
Animal()
{
cout << "Animal中调用构造函数" << endl;
}
virtual void speak() = 0;
virtual ~Animal()
{
cout << "Animal中调用虚析构函数" << endl;
}
//virtual ~Animal() = 0;
};
//Animal::~Animal()
//{
// cout << "Animal中调用纯虚析构函数" << endl;
//}
class Cat : public Animal
{
public:
Cat(string name)
{
cout << "Cat中调用构造函数" << endl;
m_Name = new string(name);
}
virtual void speak()
{
cout << *m_Name << "在说话" << endl;
}
string *m_Name;
~Cat()
{
if(m_Name != NULL)
{
cout << "Cat中调用析构函数" << endl;
delete m_Name;
m_Name = NULL;
}
}
};
void test01()
{
Animal * ani = new Cat("波斯猫");
ani->speak();
delete ani;
}
int main()
{
test01();
system("pause");
}