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

分析

正常代码中,接口基类添加了虚析构函数,析构子类对象时可以正常调用子类的析构函数,释放占用的内存;
另一端代码中,接口基类没有虚析构函数,析构子类对象时并没有调用子类的析构函数,这时子类中的成员m_str不会被释放,导致出现内存泄漏问题。

总结

综上所述,为避免出现因虚析构函数缺失而导致的内存泄漏问题,接口类以及作为基类使用的类必须添加虚析构函数,确保能正常调用析构函数。
 
posted @ 2025-05-07 23:27  AmazingLexi  阅读(27)  评论(0)    收藏  举报