自定义两个类
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中智能指针的使用相关推荐

  1. Qt源码剖析-智能指针

    目录 智能指针是什么? 为什么使用QT智能(smart)指针? Qt提供了哪些智能指针? QSharedPointer类模板(smart指针类)源码分析 1. QSharedPointer类模板对于模 ...

  2. 【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 ...

  3. C++中智能指针的原理、使用、实现

    C++中智能指针的原理.使用.实现 转自:https://www.cnblogs.com/wxquare/p/4759020.html 1 智能指针的作用 C++程序设计中使用堆内存是非常频繁的操作, ...

  4. C++中智能指针的设计和使用

    智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露.它的一种通用实现技术是使用引用计数(reference ...

  5. c++11中智能指针的原理,使用,实现

    文章目录 理解智能指针的原理 智能指针的使用 shared_ptr的使用 unique_ptr的使用 weak_ptr的使用 循环引用 指针指针的设计和实现: 理解智能指针的原理 c++程序设计中使用 ...

  6. 【Boost】boost库中智能指针——shared_ptr

    boost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而boost::shared_ptr可以解决这一局限.顾名思义,boost::shared_ptr是可以 ...

  7. 【Boost】boost库中智能指针——scoped_ptr

    boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放.下列代码演示了该指针的基本应用: #include <str ...

  8. 【Boost】boost库中智能指针——weak_ptr

    循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象.一个简单的例子如下: #include <string> #include <ios ...

  9. 【Boost】boost库中智能指针概述

    这篇文章主要介绍 boost中的智能指针的使用. 内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针.垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是 ...

最新文章

  1. Cocos2d-x 处理双击事件的两种方法
  2. uclinux与linux的区别
  3. 这里先发布一个,自己写得unityUI的适配的方案(插播)
  4. TensorFlow(四)优化器函数Optimizer
  5. 组件的v-model Mixin extends
  6. 麦块不显示服务器,为什么开不了服务器啊!
  7. Pytorch:数据并行和模型并行,解决训练过程中内存分配不均衡的问题
  8. Neutron系列 : Neutron OVS OpenFlow 流表 和 L2 Population(8)
  9. Idea启动报错 Error:java: System Java Compiler was not found in classpath
  10. Excel写入与保存openpyxl
  11. bsh.jar/beanshell下载链接
  12. 毕设项目 - 基于SSM的个人健康信息管理系统(含源码+论文)
  13. 浏览器无法下载PDF文件怎么办
  14. 计算机行业英语期中考试,《计算机专业英语》期末考试试卷
  15. vue货币过滤器以及路由参数的使用
  16. Android iText向pdf模板插入数据和图片
  17. 根据用户的搜索需求,进行智能推送
  18. 判断一句话是否中文或者英文
  19. nodejs代码保护方式--加密、混淆、编译、打包成exe
  20. 微信小程序实现watch监听数据变化

热门文章

  1. 计算机无线网络服务禁用了怎么办,无线网络禁用启用无效怎么办_无线禁用后启用不了的解决方法...
  2. 贝叶斯网络推理算法简单罗列
  3. 我获得“微软MVP”奖项,后续将会贡献更多技术内容
  4. “嫦娥四号”首拍月球背面照 香港理大助研发相机系统
  5. stable diffusion webui mov2mov
  6. 施瓦辛格将与拉里·埃利森在OOW同台“飚戏”
  7. markdown文件的基本常用编写语法-转自凌云之翼
  8. 电阻 电压 电流 电功率 电功之间的关系
  9. C语言读取txt文件内容
  10. 理解C和C++中的左值和右值