Qt内存管理(三) Qt的智能指针

本文详细介绍了Qt中的三种智能指针QPointer、QScopedPointer和QSharedDataPointer的工作原理和使用场景。QPointer通过QMetaObject确保在对象销毁时自动置NULL,防止野指针问题;QScopedPointer在退出作用域时自动删除对象,适用于局部管理非QObject对象;QSharedDataPointer则是计数型智能指针,允许多个指针共享同一对象,直到引用计数为0才销毁。文章还给出了相应的代码示例以帮助理解。
摘要由CSDN通过智能技术生成

智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。Qt常用的智能指针有QPointer,QScopedPointer,QSharedPointer。

关于这几个智能指针,网上的博客基本不是翻译Qt文档,就是翻译老外的博客,比较失望。

QPointer

QPointer属于Qt对象模型的特性,本质是一个模板类,它为QObje提供了guarded pointer。当其指向的对象(必须是QObject及其派生类)被销毁时,它会被自动置NULL,原理是其对象析构时会执行QObject的析构函数,进而执行QObjectPrivate::clearGuards(this);,这也是基于其指向对象都继承自QObject的原因。

QPointer对QMetaObject的相关操作做了简单的封装,这里的基本思想是
在QPointer构造的时候调用QMetaObject::addGuard(&o),把T的指针加入QMetaObject内的一个哈希表中,
在QPointer析构的时候调用QMetaObject::removeGuard(&o),把T的指针从哈希表中删除。

看代码:

QPointer<Test> t = new Test();      // Test类必须继承QObject
delete t;   //对象被delete之后,t会自动置NULL,而不会成为悬挂(dangling)的野指针
if(t.isNull())
    qDebug()<<"NULL";

运行后会输出NULL

实际中,QPointer用于解决这样的问题:在其他地方都用到了某个指针,在这个指针的对象被delete后,将指

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值