QT中的智能指针

本篇文章介绍的是Qt智能指针使用指南 帮助篇,Qt提供了很多智能指针的类,比较常见的有QPointer, QSharedDataPointer ,QSharedPointer,QWeakPointer和QScopedPointer等等,它们被引入的Qt版本即描述如下:

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的示例:

 
 
  1. int main(int argc, char *argv[])     
  2. {     
  3.     QCoreApplication a(argc, argv);     
  4.     //raw pointer     
  5.     QString *p = new QString("hello");     
  6.     //Implements non-reference-counted strong pointer     
  7.     QScopedPointer<QString> pScopedPointer(new QString("Scoped"));     
  8.     // Build error, can NOT be shared and reference-counted     
  9.     //QScopedPointer<QString> pScopedPointerpScopedPointer2 = pScopedPointer;     
  10.     //Implements reference-counted strong sharing of pointers     
  11.     QSharedPointer<QString> pSmart(new QString("Smart"));     
  12.     QSharedPointer<QString> pSmart2;     
  13.     pSmart2 = QSharedPointer<QString>(new QString("smart 2"));     
  14.     QSharedPointer<QString> pSharedPoninter;     
  15.     // can be shared safely and reference-counted     
  16.     pSharedPoninter = pSmart;     
  17.     qDebug() << *(pSmart.data());     
  18.     qDebug() << *(pSmart2.data());     
  19. &nbs
### Qt 智能指针概述 Qt 提供了一组智能指针类来帮助开发者更安全地管理动态分配的对象生命周期。这些智能指针可以自动释放不再使用的对象,从而减少内存泄漏的风险[^1]。 以下是几种常见的 Qt 智能指针及其用法: --- ### 一、 `QSharedPointer` `QSharedPointer` 是一种共享所有权的智能指针,类似于 C++ 标准库中的 `std::shared_ptr`。它通过引用计数机制跟踪有多少个 `QSharedPointer` 实例指向同一个对象。当最后一个 `QSharedPointer` 被销毁时,所管理的对象也会被自动删除。 #### 示例代码 ```cpp #include <QSharedPointer> #include <QObject> class MyClass : public QObject { Q_OBJECT public: MyClass() { qDebug("MyClass created"); } ~MyClass() { qDebug("MyClass destroyed"); } }; int main() { QSharedPointer<MyClass> ptr(new MyClass()); // 此处会打印 "MyClass created" } // 当函数结束时,ptr 的析构函数会被调用并释放 MyClass 对象 ``` --- ### 二、 `QWeakPointer` `QWeakPointer` 是一种弱引用智能指针,通常与 `QSharedPointer` 结合使用。它的主要作用是避免循环引用问题。由于不增加引用计数,因此不会阻止对象被销毁[^2]。 #### 示例代码 ```cpp #include <QSharedPointer> #include <QWeakPointer> #include <QDebug> int main() { QSharedPointer<int> strongPtr(new int(42)); QWeakPointer<int> weakPtr = strongPtr.toWeakRef(); if (strongPtr) { qDebug() << *strongPtr; // 输出 42 } strongPtr.clear(); // 手动清除强指针 if (!weakPtr.isExpired()) { qDebug() << weakPtr.toStrongRef().data(); } else { qDebug() << "Object has been deleted"; } } ``` --- ### 三、 `QScopedPointer` `QScopedPointer` 是一种独占所有权的智能指针,适用于仅在一个范围内有效的对象。一旦超出范围,对象就会被自动清理。这种设计非常适合那些不需要多个指针共享同一对象的情况。 #### 示例代码 ```cpp #include <QScopedPointer> #include <QObject> class MyResource { public: MyResource() { qDebug("Resource allocated"); } ~MyResource() { qDebug("Resource deallocated"); } }; void useScopedPointer() { QScopedPointer<MyResource> resource(new MyResource()); // 在此范围内有效 } // 函数结束后,resource 自动释放其管理的对象 ``` --- ### 四、 `QPointer` `QPointer` 是一种特殊的弱指针,专门用于管理继承自 `QObject` 的对象。它可以检测目标对象是否已经被销毁,并在必要时返回空值。 #### 示例代码 ```cpp #include <QObject> #include <QPointer> #include <QDebug> class MyQObject : public QObject { Q_OBJECT public: explicit MyQObject(QObject* parent = nullptr) {} }; int main() { QPointer<MyQObject> obj = new MyQObject; delete obj.data(); // 显式删除对象 if (!obj) { qDebug() << "The object was deleted."; } } ``` --- ### 五、 Qt 智能指针需要注意的事项 尽管 Qt 智能指针提供了许多便利功能,但在实际开发中仍需注意一些潜在陷阱: - **循环引用**:如果两个或更多对象相互持有对方的 `QSharedPointer`,可能会导致它们都无法正常释放。此时应考虑改用 `QWeakPointer` 来打破循环引用关系。 - **原始指针传递风险**:即使使用了智能指针,在某些情况下仍然可能需要手动操作原始指针。务必小心处理这种情况下的资源管理逻辑[^3]。 --- ### 总结 Qt 中的智能指针提供了一个强大的工具集,能够显著简化动态内存管理的任务。每种类型的智能指针都有特定的应用场景和行为特点,合理选择合适的类型对于构建高效且稳定的程序至关重要。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyFish-ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值