【Qt】智能指针QPointer, QSharedDataPointer ,QSharedPointer,QWeakPointer和QScopedPointer

9 篇文章 0 订阅

需要用到智能指针,查看文档,发现有些历史变更,所以记录一下,备忘。

Qt 智能指针QPointer, QSharedDataPointer ,QSharedPointer,QWeakPointer和QScopedPointer


一、【比较】:

QPointer (4.0) :非线程安全
曾经被标注为:过时,已经过时,可以被QWeakPointer所替代,非线程安全。
但Qt 4.6 中,改善 QPointer 的性能,仍然可用。

QSharedDataPointer (4.0) :线程安全
对数据 COPY-ON-WRITE、浅拷贝,
提供对数据的线程安全的保护,
【注意】:不是保护“指向数据的指针”。
【注意】:只能用于QSharedData。

QSharedPointer (4.5):线程安全
引用计数的可共享资源的强类型指针。

QSharedPointer 与 C++的 std::auto_ptr类似,
最大区别:
QSharedPointer,不能转让所有权;
而C++的 auto_ptr 可以转让所有权。
【注意】:scoped_ptr 不允许:被复制或被赋值!

QWeakPointer (4.5):线程安全
引用计数的可共享资源的弱类型指针。

QScopedPointer (4.6):线程安全
非引用计数的、独享资源的强类型指针。
strong pointer :在“它所指向的资源”的所有权期间,永远不会放弃这个所有权。
weak pointer:在“它所指向的资源的所有权期间”,允许:外界释放其资源、从而使其放弃这个所有权。


二、QWeakPointer 和 QPointer

1.QWeakPointer 必须和 QSharedPointer 配套用
即:QWeakPointer,只能用于 QSharedPointer类的对象。
也就是:只有 QSharedPointer 类型的对象,才能用 QWeakPointer 指针;
如果不是,就改一下基类。

【参考】:
“在 Qt 4.5 中,我们引入了 QSharedPointer 和 QWeakPointer 两个类,提供更好的性能。”

2.QPointer (4.0) 由于性能低,曾经被放弃,但 Qt4.6改善了其性能。
适用于:QPointer 可以用于所有 QObject 及其子类的对象。

【参考】:
“在 Qt 4.6 中,我们添加了一个新特性,
允许使用 QWeakPointer 直接追踪 QObject 实例数,无需通过 QSharedPointer。
当我们试图寻找改善 QPointer 的性能时,
我意识到,
“具有引用计数的引用计数器”是最好的解决方案
——事实上,因为不使用 QSharedPointer 进行追踪,
“具有引用计数的 bool 类型(reference-counted boolean)”已经足够,
但因为我们并没有 QAtomicBool 这种类型,所以我们正常地使用引用计数器也是可以的。


【参考】:
参考1:
https://www.cnblogs.com/ybqjymy/p/14918344.html

参考2:
https://blog.csdn.net/ZXGIS/article/details/8071673?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165897677116781432973746%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165897677116781432973746&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-16-8071673-null-null.142^v35^new_blog_fixed_pos,185^v2^control&utm_term=QWeakPointer&spm=1018.2226.3001.4187

参考3:
https://blog.csdn.net/lin786063594/article/details/124237989?ops_request_misc=&request_id=&biz_id=102&utm_term=QWeakPointer&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-6-124237989.142^v35^new_blog_fixed_pos,185^v2^control&spm=1018.2226.3001.4187

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值