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

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

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/2990436.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存