需要用到智能指针,查看文档,发现有些历史变更,所以记录一下,备忘。
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