QT智能指针QSharedPointer之中文文档不要忽悠我

来源:互联网 发布:windows声音设置 编辑:程序博客网 时间:2024/06/05 23:47

别看那么多智能指针的中文文档,没看懂反而看蒙了

官方文档:

QSharedPointer will delete the pointer it is holding when it goes out of scope, provided no otherQSharedPointer objects are referencing it.

QSharedPointer在代码执行超出其作用域,且是最后一个holding p的QSharedPointer时(p为其holding的指针),将执行delete p。

与QScopedPointer不同的是,QSharedPointer允许互相复制,直到所有holding p的QSharedPointer都超出作用域时,再执行delete p。

就这么简单!

另外:

1.即使A继承子QObject,在删除A对象时也不会自动删除A new的对象,需要显式指定父子关系

2.多次测试暂未发现智能指针因多次析构而发生错误


测试代码:


class QtSmartPointerTest
{
    public:

    QtSmartPointerTest()
    {
        qDebug() << "creating";
    }

    ~QtSmartPointerTest()
    {
        qDebug() << "deleting";
    }

    int var = 8;

};


class Test
{
    public:
    Test()
    {
        qDebug() << "creating Test";
        spt_ptr = new QtSmartPointerTest();
        qDebug() << spt_ptr->var;
        QSharedPointer<QtSmartPointerTest> spt_sptr(spt_ptr);
        qDebug() << spt_ptr;
    }
    ~Test()
    {
        qDebug() << spt_ptr->var <<spt_ptr;
        qDebug() << "deleting Test";
    }

    QtSmartPointerTest *spt_ptr;
};


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

    Test* test = new Test();

    delete test;

    return a.exec();
}

输出结果:

creating Test

creating

8

0x8f181d0

deleting                  //QSharedPointer调用

0     0x8f181d0                         //已经析构

deleting Test

原创粉丝点击