QT中的智能指针
来源:互联网 发布:js 获取tr 再获取td 编辑:程序博客网 时间:2024/06/05 19:38
本篇文章介绍的是Qt智能指针使用指南 帮助篇,Qt提供了很多智能指针的类,比较常见的有QPointer, QSharedDataPointer ,QSharedPointer,QWeakPointer和QScopedPointer等等,它们被引入的Qt版本即描述如下:
QPointer (4.0) 已经过时,可以被QWeakPointer所替代,它不是线程安全的。
QSharedDataPointer (4.0) -- 提供对数据的COPY-ON-WRITE以及浅拷贝,提供对数据(而不是指向数据的指针)的线程安全的保护。(注:提供对数据的线程安全保护要结合QsharedData来完成),它是线程安全的。
QSharedPointer (4.5)-- 实现了引用计数的可共享资源的强类型指针,它是线程安全的。
QWeakPointer (4.5)-- 实现了引用计数的可共享资源的弱类型指针,它是线程安全的。
QScopedPointer (4.6)-- 实现了非引用计数的独享资源的强类型指针,它是线程安全的。
strong pointer :在有它所指向的资源的所有权期间,永远不会放弃这个所有权。
weak pointer:在有它所指向的资源的所有权期间,允许外界释放其资源从而使其放弃这个所有权。
QSharedPointer有着与std::auto_ptr类似的特性,而最大的区别在于它不能转让所有权而auto_ptr可以。事实上,scoped_ptr永远不能被复制或被赋值!
下面代码使用QSharedPointer,QWeakPointer和QScopedPointer的示例:
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- //raw pointer
- QString *p = new QString("hello");
- //Implements non-reference-counted strong pointer
- QScopedPointer<QString> pScopedPointer(new QString("Scoped"));
- // Build error, can NOT be shared and reference-counted
- //QScopedPointer<QString> pScopedPointerpScopedPointer2 = pScopedPointer;
- //Implements reference-counted strong sharing of pointers
- QSharedPointer<QString> pSmart(new QString("Smart"));
- QSharedPointer<QString> pSmart2;
- pSmart2 = QSharedPointer<QString>(new QString("smart 2"));
- QSharedPointer<QString> pSharedPoninter;
- // can be shared safely and reference-counted
- pSharedPoninter = pSmart;
- qDebug() << *(pSmart.data());
- qDebug() << *(pSmart2.data());
- qDebug() << *(pSharedPoninter.data());
- QTimer *timer = new QTimer();
- QWeakPointer<QTimer> pWeakPointer = timer;
- //Weak pointer's resources can be deleted from outside world
- delete timer;
- if (pWeakPointer.isNull())
- {
- qDebug() << "contained QObject has been deleted";
- }
- }
Qt
WeakPointer 记录指针,并在指针对象被删除时,将指针设为NULL;但不管理墙引用(对指针对象的引用)计数;
SharePointer 同WeakPointer,但会管理引用计数,计数为0时,会删除指针对象,同时也设置指针为NULL。
使用情景:
有一个数据源,由多个编辑器共享。设计者希望在有编辑器被创建的时候,创建改数据源,后续新创建的编辑器则使用前面已经创建好的数据源。等最后一个编辑器销毁的时候,一并销毁数据源。
123456789101112131415161718192021class
Source
{
}
class
Editor
{
public
:
Editor();
private
:
static
QWeakPointer<Source> s_source;
// store the created source object;
QSharedPointer<Source> m_sharedSource;
// local used pointer
}
static
WeakPointer<Source> Editro::s_source;
Editro()
{
if
(s_source.isNull()) {
m_shardSource = QSharedPointer<Source>(
new
Source);
s_source = m_shardSource;
}
else
{
m_sharedSource = s_source.toStrongRef();
}
}
- Qt中的智能指针
- Qt中的智能指针
- Qt中的智能指针
- Qt 中的智能指针
- QT中的智能指针
- Qt 智能指针学习
- Qt 智能指针学习
- Qt 智能指针学习
- Qt 智能指针学习
- Qt 智能指针学习
- Qt智能指针
- Qt 智能指针学习
- Qt 智能指针实例
- Qt智能指针
- Qt 智能指针学习
- Qt--智能指针
- Qt里的智能指针
- Qt智能指针学习总结
- 提升解决问题的能力:学会提问,就解决了一半
- iOS MJExtension字典转模型高级使用技巧
- 分享一段shell脚本--su权限下自动读取某个GPIO电平,判断为低即自动关机的功能
- java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger for JUnit test case for Java mail
- maven编译时java.lang.ArrayIndexOutOfBoundsException
- QT中的智能指针
- 干货看再多,也不一定能成为优秀产品经理
- 替换tomcat中webapp里的前端文件,浏览器没有检查到更新
- 单例模式在多线程下的安全性
- android Ble通信
- 关于求最大公约数gcd的一些证明
- Spring boot + Websocket 初篇
- 产品经理,要“看懂”、更要“看破”
- 心理估值:什么样的价值对用户有意义?