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";
}
}

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

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

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

Qt智能指针QPointer, QSharedDataPointer ,QSharedPointer,QWeakPointer和QScopedPointer的更多相关文章

  1. Qt 智能指针学习(7种指针)

    Qt 智能指针学习 转载自:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ ...

  2. Qt 智能指针学习(7种QT的特有指针)

    从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int arg ...

  3. Qt 智能指针学习(7种QT智能指针和4种std智能指针)

    从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int arg ...

  4. Qt 智能指针学习

    原地址:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include & ...

  5. [转]Qt 智能指针学习

    从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int arg ...

  6. Qt智能指针简明说明

    下面的智能指针分别对应boost库,Qt库,c++11的智能指针 boost::scoped_ptr  QScopedPointer unique_ptr 在其生命期结束后会自动删除它所指的对象(确定 ...

  7. Qt中容器类应该如何存储对象(最好使用对象指针类型,如:QList<TestObj*>,而不要使用 QList<TestObj> 这样的定义,建议采用 智能指针QSharedPointer)

    Qt提供了丰富的容器类型,如:QList.QVector.QMap等等.详细的使用方法可以参考官方文档,网上也有很多示例文章,不过大部分文章的举例都是使用基础类型:如int.QString等.如果我们 ...

  8. 智能指针类模板(中)——Qt中的智能指针

    Qt中的智能指针-QPointer .当其指向的对象被销毁时,它会被自动置空 .析构时不会自动销毁所指向的对象-QSharedPointer .引用计数型智能指针 .可以被自由的拷贝和赋值 .当引用计 ...

  9. C++中的智能指针类模板

    1,智能指针本质上是一个对象,这个对象可以像原生的指针一样使用,因为智能指 针相关的类通过重载的技术将指针相关的操作符都进行了重载,所以智能指针对象可以像原生指针一样操作,今天学习智能指针类模板,通过 ...

随机推荐

  1. vue中$router与$route的区别

    $.router是VueRouter的实例,相当于一个全局的路由器对象.包含很多属性和子对象,例如history对象 $.route表示当前正在跳转的路由对象.可以通过$.route获取到name,p ...

  2. 单例DCL模式

    单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例. 一般写法 public class DCLSingle { public static DCLSingle instance= n ...

  3. [高清·非影印]Spring实战+SpringBoot实战+Spring微服务实战+SpringCloud微服务实战(全4本)

    ------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...

  4. Docker学习笔记(一)—— 概述

    1. Docker是个什么玩意 说Docker是什么之前,先来看一看Docker为什么会出现.我们知道,在学习过程中我们需要频繁地安装配置一些软件,不管是在Windows下还是在Linux,这些东西的 ...

  5. NEST 增删改查

    /// <summary> /// HEAD /employee/employee/1 /// </summary> public void DocumentExists() ...

  6. iOS - app 进行安全加固

    研究了大半年逆向工程了,没在博客做记录,最近看到篇,跟自己的想法不谋而合,摘要下: 运行在越狱设备上的 iOS app,非常容易遭到破解分析,这里我列举一些可以加大破解难度的方法,希望有所帮助. 一些 ...

  7. 【转载】 C#使用Math.PI常量来表示圆周率

    在C#中计算圆形面积的时候,我们时常会用到圆周率这个变量,圆周率我们一般定义为十进制decimal类型变量,圆周率的值为3.1415926535等一个近似值,其实在C#的数值计算类Math类中,有专门 ...

  8. UCOSIII事件标志组

    两种同步机制 "或"同步 "与"同步 使能 #define OS_CFG_FLAG_EN 1u /* Enable (1) or Disable (0) cod ...

  9. Python学习日记(二十四) 继承

    继承 什么是继承?就是一个派生类(derived class)继承基类(base class)的字段和方法.一个类可以被多个类继承;在python中,一个类可以继承多个类. 父类可以称为基类和超类,而 ...

  10. 详解微信公众平台UnionID和OpenID的区别

    OpenID: 普通用户的标识,对当前开发者帐号唯一.一个openid对应一个公众号. UnionID :用户统一标识.针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的.   微信的 ...