【QT】qt的智能指针

智能指针

C++标准库中的三种智能指针:

std::shared_ptr:使用引用计数,每一个shared_ptr的拷贝都指向相同的内存,每次拷贝都会触发引用计数+1,每次生命周期结束析构的时候引用计数-1,在最后一个shared_ptr析构的时候,内存才会释放。

std::weak_ptr:用来监视shared_ptr的生命周期,它不管理shared_ptr内部的指针,它的拷贝析构都不会影响引用计数,纯粹是作为一个旁观者监视shared_ptr中管理的资源是否存在,可以用来返回this指针和解决循环引用问题。

std::unique_ptr:独占型的智能指针,它不允许其它智能指针共享其内部指针,也不允许unique_ptr的拷贝和赋值。

Qt中的智能指针:

QPointer,提供了指向QObject的保护指针

复制代码
QPointer只能用于指向QObject及派生类的对象。当一个QObject或派生类对象被删除后,QPointer能自动	将其内部的指针设置为0,这样在使用QPointer之前就可以判断一下是否有效。QPointer对象超出作用域时,并不会删除它指向的内存对象。

QScopedPointer,和std::unique_ptr其概念是一样的

QSharedPointer,和std::shared_ptr其作用是一样的

QWeakPointer,和std::weak_ptr功能是一样的

一些名词:空指针,野指针,垂悬指针,无效指针

空指针:指针值为NULL nullptr 0

野指针:指针未初始化地址

垂悬指针:指向已删除(或释放)的内存位置的指针称为悬空指针

无效指针:指针指向内存的类型为void*,是一种特殊类型指针

使用Qt智能指针的设计需求通常涉及到以下几个方面:

自动内存管理: 你希望确保在对象不再需要时能够自动释放其内存,避免内存泄漏。

对象所有权的传递: 你希望在对象的所有权传递给其他部分时,能够方便地管理对象的生命周期。

对象的共享所有权: 你希望多个部分能够共享同一个对象,而不需要手动跟踪引用计数或手动释放内存。

异常安全: 你希望在发生异常时能够安全地释放资源,而不会导致资源泄漏。

示例:图形界面应用中的资源管理

一个图形界面应用,其中有一个文档对象 ,而文档对象中包含多个图形对象。每个图形对象可能有自己的资源,例如图像数据。你希望确保在文档对象或图形对象不再需要时,相关的资源能够被正确释放。

cpp 复制代码
#include <QSharedPointer>
#include <QScopedPointer>
#include <QDebug>

// 假设的图形对象类
class GraphicObject {
public:
    GraphicObject() { qDebug() << "GraphicObject created"; }
    ~GraphicObject() { qDebug() << "GraphicObject destroyed"; }

    // 具体的图形对象操作
};

// 文档对象类
class Document {
public:
    Document() { qDebug() << "Document created"; }
    ~Document() { qDebug() << "Document destroyed"; }

    // 添加图形对象到文档
    void addGraphicObject(QSharedPointer<GraphicObject> graphicObject) {
        graphicObjects.append(graphicObject);
    }

    // 具体的文档操作

private:
    QList<QSharedPointer<GraphicObject>> graphicObjects;
};

int main() {
    // 使用 QSharedPointer 确保图形对象的自动释放
    QSharedPointer<GraphicObject> graphicObject(new GraphicObject);

    // 使用 QScopedPointer 确保文档对象的自动释放
    QScopedPointer<Document> document(new Document);

    // 将图形对象添加到文档
    document->addGraphicObject(graphicObject);

    // 注意:在这里,graphicObject 和 document 会在适当的时候自动释放

    return 0;
}

Document 类包含一个 QList,用于存储 QSharedPointer< GraphicObject >。这确保了在文档对象析构时,与其关联的所有图形对象也会被正确释放。同时,QScopedPointer 确保了 Document 对象本身在不再需要时能够被正确释放。

智能指针管理内存的一个关键特性:对象的生命周期与智能指针的生命周期绑定在一起

相关推荐
风吹心凉21 分钟前
python3基础2026.7.22
开发语言·python
qq_4523962328 分钟前
第五篇:《接口与错误处理:Go 的哲学》
开发语言·后端·golang
Escalating_xu42 分钟前
C++可变参数模板与引用折叠精讲
开发语言·c++
wuyk5551 小时前
59.嵌入式C语言高级宏定义实战:多行宏、字符串化与符号拼接
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·51单片机
云泽8081 小时前
Visual Studio 2026 新手保姆级教程:环境搭建、界面优化与编译器配置详解
开发语言·c++·c·开发工具·visual studio
2zcode2 小时前
基于MATLAB深度学习的乳腺钼靶影像乳腺癌智能诊断系统设计与实现
开发语言·深度学习·matlab·乳腺癌
MoonBit月兔2 小时前
错过大赛报名?MoonBit 开源大赛- 8 月黑客松正式开启
开发语言·ai-native·moonbit
weixin_538601972 小时前
智能体测开Day31
开发语言·python
geovindu2 小时前
java: Facade Pattern
java·开发语言·后端·外观模式·结构型模式
listening7772 小时前
HarmonyOS 6.1 元服务深度优化:从“秒开”到“常驻”的极致体验
java·开发语言·spring