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

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 pScopedPointer(new QString(“Scoped”));
// Build error, can NOT be shared and reference-counted
//QScopedPointer pScopedPointerpScopedPointer2 = pScopedPointer;
//Implements reference-counted strong sharing of pointers
QSharedPointer pSmart(new QString(“Smart”));
QSharedPointer pSmart2;
pSmart2 = QSharedPointer(new QString(“smart 2”));
QSharedPointer pSharedPoninter;
// can be shared safely and reference-counted
pSharedPoninter = pSmart;
qDebug() << *(pSmart.data());
qDebug() << *(pSmart2.data());
qDebug() << *(pSharedPoninter.data());
QTimer *timer = new QTimer();
QWeakPointer pWeakPointer = timer;
//Weak pointer’s resources can be deleted from outside world
delete timer;
if (pWeakPointer.isNull())
{
qDebug() << “contained QObject has been deleted”;
}
}

原文地址:http://mobile.51cto.com/symbian-272817.htm

https://www.xuebuyuan.com/727528.html

https://blog.csdn.net/yao5hed/article/details/81092152

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt智能指针--QWeakPointer ⽂章⽬录 概述 前⾯我们说到的是⼀个强引⽤类型的智能指针,⽽QWeakPointer是⼀个弱引⽤类型的智能指针,和C++中的weak_ptr功能是⼀样的。 QWeakPointer 是为配合 QSharedPointer ⽽引⼊的⼀种智能指针,它更像是 QSharedPointer 的⼀个助⼿(因为它不具有普通指针的⾏ 为,没有重载operator*和->)。它的最⼤作⽤在于协助 QSharedPointer ⼯作,像⼀个旁观者⼀样来观测资源的使⽤情况。 QWeakPointer QWeakPointer不能⽤于直接取消引⽤指针,但它可⽤于验证指针是否已在另⼀个上下⽂中被删除。并且QWeakPointer对象只能通过 QSharedPointer的赋值来创建。 需要注意的是,QWeakPointer不提供⾃动转换操作符来防⽌错误发⽣。即使QWeakPointer跟踪指针,也不应将其视为指针本⾝,因为它 不能保证指向的对象保持有效。 说了那么多,QWeakPointer到底有什么⽤呢? 答案就是:解除循环引⽤。 在概述中我们说到,QWeakPointer 是为配合 QSharedPointer ⽽引⼊的⼀种智能指针。⽽什么叫循环引⽤,就是说:两个对象互相使⽤ ⼀个 QSharedPointer成员变量指向对⽅(你中有我,我中有你)。由于QSharedPointer是⼀个强引⽤的计数型指针,只有当引⽤数为0 时,就会⾃动删除指针释放内存,但是如果循环引⽤,就会导致QSharedPointer指针的引⽤永远都不能为0,这时候就会导致内存⽆法释 放。 所以QWeakPointer诞⽣了,它就是为了打破这种循环的。并且,在需要的时候变成QSharedPointer,在其他时候不⼲扰 QSharedPointer的引⽤计数。它没有重载 * 和 -> 运算符,因此不可以直接通过 QWeakPointer 访问对象,典型的⽤法是通过 lock() 成 员函数来获得 QSharedPointer,进⽽使⽤对象。 ⽰例 ⾸先,我们来看⼀个QSharedPointer循环使⽤的⽰例: #include <QWidget> #include <QDebug> #include <QWeakPointer> #include <QSharedPointer> class Children; class Parent { public: ~Parent(){ qDebug() << __FUNCTION__; } QSharedPointer<Children> m_pChildren; }; class Children { public: ~Children(){ qDebug() << __FUNCTION__; } QSharedPointer<Parent> m_pParent; }; class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); void test(); }; #include "widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) { test(); } Widget::~Widget() { qDebug() << __FUNCTION__; } void Widget::test() { QSharedPointer<Parent> parent(new Parent()); QSharedPointer<Children> children(new Children()); if(parent && children){ parent->m_pChildren = children; children->m_pParent = parent; } } 在构造函数中调⽤test()函数,执⾏完过后应该会⾃动释放parent和children对象,但是由于相互引⽤,在退出之前,引⽤计数为2,退出 之后引⽤计数还是1,所以导致不能⾃动释放,并且此时这两个对象再也⽆法访问到。运⾏过后发现并没有进⼊到Parent和Children的析构 函数中。这就导致了内存泄漏。 那么该如何解决这个问题呢? 很简单,直接将上述代码中的 QSharedPointer<Children> m_pChildren; QSharedPointer<Parent> m_pParent; 改成 QWeakPointer<Children> m_pChildren; QWeakPointer<Parent> m_pParent; 这时候

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值