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<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的更多相关文章
- Qt 智能指针学习(7种指针)
Qt 智能指针学习 转载自:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ ...
- Qt 智能指针学习(7种QT的特有指针)
从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int arg ...
- Qt 智能指针学习(7种QT智能指针和4种std智能指针)
从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int arg ...
- Qt 智能指针学习
原地址:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include & ...
- [转]Qt 智能指针学习
从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int arg ...
- Qt智能指针简明说明
下面的智能指针分别对应boost库,Qt库,c++11的智能指针 boost::scoped_ptr QScopedPointer unique_ptr 在其生命期结束后会自动删除它所指的对象(确定 ...
- Qt中容器类应该如何存储对象(最好使用对象指针类型,如:QList<TestObj*>,而不要使用 QList<TestObj> 这样的定义,建议采用 智能指针QSharedPointer)
Qt提供了丰富的容器类型,如:QList.QVector.QMap等等.详细的使用方法可以参考官方文档,网上也有很多示例文章,不过大部分文章的举例都是使用基础类型:如int.QString等.如果我们 ...
- 智能指针类模板(中)——Qt中的智能指针
Qt中的智能指针-QPointer .当其指向的对象被销毁时,它会被自动置空 .析构时不会自动销毁所指向的对象-QSharedPointer .引用计数型智能指针 .可以被自由的拷贝和赋值 .当引用计 ...
- C++中的智能指针类模板
1,智能指针本质上是一个对象,这个对象可以像原生的指针一样使用,因为智能指 针相关的类通过重载的技术将指针相关的操作符都进行了重载,所以智能指针对象可以像原生指针一样操作,今天学习智能指针类模板,通过 ...
随机推荐
- 一个长耗时SQL在TiDB和Mysql上的耗时测试
之前看到的TiDB和MySql的性能对比都是大量短耗时请求下的压测,单机情况下TiDB和MySql的确有些差距,不过笔者最近碰到的场景更多是sql要扫描的行数不小的情况下单sql比较耗时的问题,所以自 ...
- 从create-react-app开始,构建项目架构
1.生成项目 命令行执行:create-react-app myapp,生成如下结构: 2.安装sass依赖,让你在项目中可以使用scss模块化,index.module.scss: npm i n ...
- Python Django 协程报错,进程池、线程池与异步调用、回调机制
一.问题描述 在Django视图函数中,导入 gevent 模块 import gevent from gevent import monkey; monkey.patch_all() from ge ...
- golang ---调用window api函数执行程序
package main import "syscall" import "unsafe" func main() { var hand uintptr = u ...
- OI数学汇总
最前面:\(\LaTeX\)可能需要加载一会,请耐心等待o~ 前言 数学在\(\text{OI}\)中十分重要.其中大多都是数论. 什么是数论? \[ 研究整数的理论 --zzq \] 本文包含所有侧 ...
- Window 服务器安装MongoDB 设置外网可访问
1.下载MongoDB www.mongodb.com/download-center#community 2.下一步下一步安装. 安装完成后配置环境变量 我的的默认安装,环境变量地址 C:\Pro ...
- python 爬虫 user-agent 生成
有些网站做了反爬技术,如:比较初级的通过判断请求头部中的user-agent字段来检测是否通过浏览器访问的. 在爬这类网站时需要模拟user-agent import random import re ...
- ERROR: Cannot uninstall 'chardet'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
pip 安装 docker库报错: ERROR: Cannot uninstall 'chardet'. It is a distutils installed project and thus we ...
- Core Animation笔记(变换)
1.仿射变换 CGAffineTransformMakeScale : CGAffineTransformMakeTranslation CGAffineTransformMakeRotation(C ...
- 听说你知道什么是锁 --JAVA
I.java中的锁 1.1 什么是锁 在计算机科学中,锁(lock)与互斥(mutex)是一种同步机制,用于在许多线程执行时对资源的限制. 锁通常需要硬件支持才可以有效实施.这种支持通常采用一 ...