【C++】智能指针的实现如果是void指针,将会调用不了管理的对象的析构函数

博客探讨了智能指针在使用void指针时无法正确调用管理对象析构函数的现象,指出这可能导致内存泄漏,特别是当管理对象包含容器时。文章通过代码示例展示了问题,并解释了原因:void指针使得编译器无法找到正确的析构函数。此外,还强调了如果析构函数未被调用,其成员析构函数也不会执行,进一步说明了内存管理的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 结论:如下面代码运行结果所示,智能指针的实现如果是 void 指针,将会调用不了管理的对象的析构函数。
  • 原因:应该是转化成了 void*,编译器找不到该对象的析构函数了。
  • 影响:如果管理对象的类,里面有容器的话,将会造成较大的内存泄漏(注意容器的元素是在堆内存的,需要析构函数去 free 掉内存)。
  • 其他:如果管理的对象没有被调用析构函数,那么其成员函数也就不会被调用析构函数(先析构成员变量,再析构自己。这个和构造的顺序是相反的)。
#include <QCoreApplication>
#include <QDebug>

class MyTest
{
public:
    MyTest()
    {
        qDebug() << "MyTest ctor";
    }

    ~MyTest()
    {
        qDebug() << "MyTest dector";
    }
};

class Test
{
public:
    Test(void* ptr)
        : m_ptr(ptr)
    {
        qDebug() << "Test ctor";
    }

    ~Test()
    {
        delete m_ptr;
        qDebug() << "Test dector";
    }

    void* m_ptr;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    {
        MyTest *pTest = new MyTest();
        Test test(pTest);
    }

    qDebug() << "Fin";

    return a.exec();
}
// 运行结果:

MyTest ctor
Test ctor
Test dector
Fin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值