C++随笔1:虚析构函数不正确使用导致内存泄漏
代码测试
先看一段析构正常的demo代码,接口类ITest中包含了虚析构函数
#include <iostream>
#include <string>
class ITest
{
public:
virtual ~ITest() = default;
virtual void Init()= 0;
}
class TestCasel : public ITest
{
public:
explicit TestCasel() = default;
virtual ~TestCasel()
{
std::cout << "~TestCase1()" << std::endl;
delete m_str;
}
virtual void Init()
{
m_str = new std::string("abc");
}
private:
std::string* m_str = nullptr;
}
int main(int argc, char** argv)
{
ITest* test = new TestCasel;
test->Init();
delete test;
system("pause");
return 0;
}
这段代码输出如下:

把接口类ITest中的虚析构函数删除,模拟接口类中忘记添加虚析构函数的情况,代码如下
class ITest
{
public:
virtual void Init()= 0;
}
修改后再运行程序,输出如下:

分析
正常代码中,接口基类添加了虚析构函数,析构子类对象时可以正常调用子类的析构函数,释放占用的内存;
另一端代码中,接口基类没有虚析构函数,析构子类对象时并没有调用子类的析构函数,这时子类中的成员m_str不会被释放,导致出现内存泄漏问题。
总结
综上所述,为避免出现因虚析构函数缺失而导致的内存泄漏问题,接口类以及作为基类使用的类必须添加虚析构函数,确保能正常调用析构函数。
浙公网安备 33010602011771号