QT智能指针

QSharedPointer

带管家(引用计数)的智能指针

复制代码
// 创建一个对象,计数=1
QSharedPointer<MyClass> p1 = new MyClass; 

// 拷贝!计数变成 2
QSharedPointer<MyClass> p2 = p1;

// 拷贝!计数变成 3
QSharedPointer<MyClass> p3 = p2;
1. 创建方式
复制代码
// 方式1
QSharedPointer<MyClass> ptr(new MyClass);

// 方式2(Qt5.14+ 推荐,更安全)
auto ptr = QSharedPointer<MyClass>::create();
2. 拷贝 / 赋值
复制代码
auto ptr2 = ptr; // 计数+1
3. 主动释放
复制代码
ptr.reset(); // 计数-1
4. 判断是否为空
复制代码
if(ptr.isNull()) { }
if(ptr) { }
5. 获取原始指针
复制代码
MyClass* raw = ptr.data();

QEnableSharedFromThis

使类能够安全地从成员函数内部获得指向自身的 shared_ptr。

复制代码
#include <QApplication>
#include <QEnableSharedFromThis>
#include <QDebug>
class MyClass:public QEnableSharedFromThis<MyClass>{
public:
    QSharedPointer<MyClass> getShared(){
        return sharedFromThis();
    }
};
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    //    std::shared_ptr<MyClass> obj1 = std::make_shared<MyClass>();
    //    qDebug()<<obj1.use_count();
    //    QSharedPointer<MyClass> ptr11(MyClass());
    QSharedPointer<MyClass> ptr1 = QSharedPointer<MyClass>::create();
    QSharedPointer<MyClass> ptr2 = ptr1->getShared();
    qDebug()<<ptr1.data();
    qDebug()<<ptr2.data();
    return a.exec();
}

QSharedPointer 没有提供获取引用计数的函数,std::shared_ptr 有 use_count()。

QScopedPointer

类似于标准库中的 std::unique_ptr,负责对象的自动释放,以防止内存泄漏。

QScopedPointer = 自动管理内存的指针 作用:new 创建的对象,不用手动 delete,离开作用域自动释放 特点:不能拷贝、不能转移所有权,谁创建谁负责到底

复制代码
QScopedPointer<MyClass> p(new MyClass);
// 离开大括号 {} 自动 delete
// 你永远不用写 delete!

QScopedPointer<MyClass> sp(new MyClass);

sp.get();         // 获取原始指针(MyClass*)
sp->method();     // 调用方法
sp.data();        // 和 get() 一样
sp.reset();       // 手动删除对象
sp.reset(new MyClass); // 删除旧对象,托管新对象
sp.take();        // 取消托管,返回原始指针(不再自动删除)
相关推荐
Decay__3 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
学长毕设6 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw7 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
小徐不徐说8 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
源码集结号8 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
小王C语言8 小时前
Qt常用控件:容器类控件,标题分组框、标签页(浏览器标签)
开发语言·qt
论文复现现场8 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠8 小时前
泛微OAe9-后端二开异步调用
java
TMedical8 小时前
MedPlanning 截骨模拟矫形功能
c++·图像处理·人工智能·qt·健康医疗
Decay__9 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构