【QT小记】QT中智能指针的使用
自定义两个类
class OnePiece {
public:OnePiece() {qDebug() << QString("构造OP");}~OnePiece() {qDebug() << QString("~析构OP");}
public:void print() {qDebug() << QString("OP在拉夫德鲁");}
};class Nika : public QObject {
public:Nika() {qDebug() << "构造尼卡";}~Nika() {qDebug() << "析构尼卡";}public:void print() {qDebug() << "这个时代,路飞是尼卡";}
};
QSharedPointer && QWeakPointer
- QSharedPointer
- 共享指针
- 强引用
- 线程安全
- 内部采用引用计数,引用计数的原子机制的
- 引用计数为0时,释放对象,删除原生指针
- QWeakPointer
- 线程安全
- 弱引用
- 不增加引用计数
- 不能调用原生指针对象方法(没有重载operator*和->)
- 配合QSharedPointer使用,解除循环引用问题
// QSharedPointer + QWeakPointerqDebug() << "QSharedPointer Example Start...";//case1 引用计数{QSharedPointer<OnePiece> op1 = QSharedPointer<OnePiece>(new OnePiece); //引用计数为1QSharedPointer<OnePiece> op2(op1); //引用计数为2QSharedPointer<OnePiece> op3 = op1; //引用计数为3op3->print();// 弱引用QWeakPointer<OnePiece> op4 = op1; //引用计数为3// 弱引用转为强引用QSharedPointer<OnePiece> op5 = op4.toStrongRef(); //引用计数为4QSharedPointer<OnePiece> op6 = op4.lock(); //引用计数为5op6->print();}//case2 取出原生指针(不建议取出原生指针操作){QSharedPointer<OnePiece> op = QSharedPointer<OnePiece>(new OnePiece); //引用计数为1OnePiece *op1 = op.data();op1->print();OnePiece *op2 = op.get();op2->print();}//case3 清除对象 解除对原生指针的引用,若为最后一个引用,则删除对象{QSharedPointer<OnePiece> op1 = QSharedPointer<OnePiece>(new OnePiece); //引用计数为1QSharedPointer<OnePiece> op2(op1); //引用计数为2op2.clear(); //引用计数为1if (op2.isNull()) {qDebug() << "op2 is null";}}qDebug() << "QSharedPointer Example End...";
QScopedPointer
- 独享指针(没有拷贝构造和赋值构造接口)
- 没有引用计数
- 线程安全
// QScopedPointerqDebug() << "QScopedPointer Example Start...";// case1 独享指针{QScopedPointer<OnePiece> op(new OnePiece);op->print();}// case2 使用例子{auto func1 = [](int i){OnePiece *op = new OnePiece;if (i < 5) {delete op; //不方便管理,这个位置可能会忘记deletereturn;}op->print();delete op;return ;};auto func2 = [](int i){QScopedPointer<OnePiece> op(new OnePiece);if (i < 5) {return;}op->print();return;};}// case3 取出原生指针{QScopedPointer<OnePiece> op(new OnePiece);OnePiece *op1 = op.data(); //op扔持有对象OnePiece *op2 = op.get(); //op扔持有对象qDebug() << (op.isNull() ? "op is null" : "op is not null");OnePiece *op3 = op.take(); //op为nullqDebug() << (op.isNull() ? "op is null" : "op is not null");// 错误例子auto fun = []()->OnePiece * {QScopedPointer<OnePiece> op1(new OnePiece);op1->print();return op1.data();
// OnePiece op1;
// op1.print();
// return &op1;};OnePiece *op7 = fun(); //fun()中op1被析构,所以会delete原生指针,所以op7会成为悬挂指针op7->print(); //测试后正常输出,有点奇怪???}qDebug() << "QScopedPointer Example End...";
QPointer
- 只能使用于继承自QObject的类
- 如果多个QPointer同时指向同一个对象,其中一个被delete,其它的QPointer则会被置为nullptr,避免了成为野指针的情况
// QPointerqDebug() << "QPointer Example Start...";{QPointer<Nika> nika1(new Nika);QPointer<Nika> nika2 = nika1;if (!nika1.isNull()) {nika1->print();}nika1.clear();if (nika1.isNull()) {qDebug() << "nika1 is null";}if (!nika2.isNull()) {nika2->print();}QPointer<Nika> nika3 = nika2;delete nika2; //nika2被delete后,nika3也会被置为nullptrif (nika3.isNull()) {qDebug() << "nika3 is null";}}qDebug() << "QPointer Example End...";
QScopedArrayPointer
- 使用于数组对象
// QScopedArrayPointerqDebug() << "QScopedArrayPointer Example Start...";{QScopedArrayPointer<OnePiece> ops(new OnePiece[3]);ops[0].print();//OnePiece op = ops[1];//op.print();}qDebug() << "QScopedArrayPointer Example End...";
QSharedDataPointer
- 方便实现隐式共享类
- 待补充
QExplicitlySharedDataPointer
- 方便实现显示共享类
- 待补充
Sevenlin++
目前在平时编码过程中基本不使用智能指针,还是在使用原生指针,这一点需要改进。有这么好的方式来管理指针,不用白不用,也可以避免指针管理不当造成的内存泄露。
【QT小记】QT中智能指针的使用相关推荐
- Qt源码剖析-智能指针
目录 智能指针是什么? 为什么使用QT智能(smart)指针? Qt提供了哪些智能指针? QSharedPointer类模板(smart指针类)源码分析 1. QSharedPointer类模板对于模 ...
- 【Smart_Point】C/C++ 中智能指针
C++11智能指针 目录 C++11智能指针 1.1 C++11智能指针介绍 1.2 为什么要使用智能指针 1.2.1 auto_ptr(C++98的方案,C++11已经抛弃)采用所有权模式. 1.2 ...
- C++中智能指针的原理、使用、实现
C++中智能指针的原理.使用.实现 转自:https://www.cnblogs.com/wxquare/p/4759020.html 1 智能指针的作用 C++程序设计中使用堆内存是非常频繁的操作, ...
- C++中智能指针的设计和使用
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露.它的一种通用实现技术是使用引用计数(reference ...
- c++11中智能指针的原理,使用,实现
文章目录 理解智能指针的原理 智能指针的使用 shared_ptr的使用 unique_ptr的使用 weak_ptr的使用 循环引用 指针指针的设计和实现: 理解智能指针的原理 c++程序设计中使用 ...
- 【Boost】boost库中智能指针——shared_ptr
boost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而boost::shared_ptr可以解决这一局限.顾名思义,boost::shared_ptr是可以 ...
- 【Boost】boost库中智能指针——scoped_ptr
boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放.下列代码演示了该指针的基本应用: #include <str ...
- 【Boost】boost库中智能指针——weak_ptr
循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象.一个简单的例子如下: #include <string> #include <ios ...
- 【Boost】boost库中智能指针概述
这篇文章主要介绍 boost中的智能指针的使用. 内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针.垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是 ...
最新文章
- Cocos2d-x 处理双击事件的两种方法
- uclinux与linux的区别
- 这里先发布一个,自己写得unityUI的适配的方案(插播)
- TensorFlow(四)优化器函数Optimizer
- 组件的v-model Mixin extends
- 麦块不显示服务器,为什么开不了服务器啊!
- Pytorch:数据并行和模型并行,解决训练过程中内存分配不均衡的问题
- Neutron系列 : Neutron OVS OpenFlow 流表 和 L2 Population(8)
- Idea启动报错 Error:java: System Java Compiler was not found in classpath
- Excel写入与保存openpyxl
- bsh.jar/beanshell下载链接
- 毕设项目 - 基于SSM的个人健康信息管理系统(含源码+论文)
- 浏览器无法下载PDF文件怎么办
- 计算机行业英语期中考试,《计算机专业英语》期末考试试卷
- vue货币过滤器以及路由参数的使用
- Android iText向pdf模板插入数据和图片
- 根据用户的搜索需求,进行智能推送
- 判断一句话是否中文或者英文
- nodejs代码保护方式--加密、混淆、编译、打包成exe
- 微信小程序实现watch监听数据变化
热门文章
- 计算机无线网络服务禁用了怎么办,无线网络禁用启用无效怎么办_无线禁用后启用不了的解决方法...
- 贝叶斯网络推理算法简单罗列
- 我获得“微软MVP”奖项,后续将会贡献更多技术内容
- “嫦娥四号”首拍月球背面照 香港理大助研发相机系统
- stable diffusion webui mov2mov
- 施瓦辛格将与拉里·埃利森在OOW同台“飚戏”
- markdown文件的基本常用编写语法-转自凌云之翼
- 电阻 电压 电流 电功率 电功之间的关系
- C语言读取txt文件内容
- 理解C和C++中的左值和右值