QT指针类

C++11有智能指针类,在 Qt 中也提供了类似的替代功能,并且比 C++11 标准中提供的功能还要强大,所以如果我们使用 Qt 作为基础库,那么就没有必要使用C++11 的智能指针。

Qt 的智能指针包括:

QSharedPointer
QScopedPointer
QScopedArrayPointer
QWeakPointer
QPointer
QSharedDataPointer


QSharedPointer

与 shared_ptr类似shared_ptr允许有多个指针指向同一个对象,比如有 5个 QSharedPointer 拥有同一个内存资源,那么这个引用计数就是 5。这时如果一个 QSharedPointer 离开了它的作用域,那么就还剩下 4 个 QSharedPointer 拥有这个内存资源,引用计数就变为了 4。 当引用计数下降到 0 时,这个内存资源就被释放了。

QSharedPointer 是线程安全的,因此即使有多个线程同时修改 QSharedPointer 对象也不需要加锁。这里要特别说明一下,虽然 QSharedPointer 是线程安全的,但是 QSharedPointer 指向的内存区域可不一定是线程安全的。所以多个线程同时修改 QSharedPointer 指向的数据时还要应该考虑加锁的。

QScopedPointer

类似于 C++ 11 中的 unique_ptr,QScopedPointer类存储指向动态分配对象的指针,并在销毁时删除它。手工管理堆分配的对象是困难的,而且容易出错,其常见的结果是代码泄漏内存,难以维护。QScopedPointer是一个小型实用程序类,它通过将基于堆栈的内存所有权分配给堆分配,极大地简化了这一过程,通常称为资源获取初始化(resource acquisition is initialize, RAII)。这个指针类能够在动态管理指针时,在变量的作用域结束时,释放内存。(目前觉得在处理局部变量比较有用,能自动回收动态分配的内存,如果作为成员变量,必须在初始化链表的构造函数初始化,不能直接。。。=new 。。。因为它没有=运算符)。

使用示范

void myFunction(bool useSubClass)
{
    // assuming that MyClass has a virtual destructor
    QScopedPointer<MyClass> p(useSubClass ? new MyClass() : new MySubClass);
    QScopedPointer<QIODevice> device(handsOverOwnership());

    if (m_value > 3)
        return;

    process(device);
}

QScopedArrayPointer

和QScopedPointer类似,用于数组。

void foo()
  {
      QScopedArrayPointer<int> i(new int[10]);
      i[2] = 42;
      ...
      return; // our integer array is now deleted using delete[]
  }

QPointer(待测试使用)

QPointer 与其他的智能指针有很大的不同。其他的智能指针都是为了自动释放内存资源而设计的。 QPointer 智能用于指向 QObject 及派生类的对象。当一个 QObject 或派生类对象被删除后,QPointer 能自动把其内部的指针设为 0。(而C++指针的对象被删除后会变成悬空指针)这样我们在使用这个 QPointer 之前就可以判断一下是否有效了。

为什么非要是 QObject 或派生类呢,因为 QObject 可以构成一个对象树,当这颗对象树的顶层对象被删除时,它的子对象自动的被删除。所以一个 QObject 对象是否还存在,有时并不是那么的明显。有了 QPointer 我们在使用一个对象之前,至少可以判断一下。

要特别注意的是,当一个 QPointer 对象超出作用域时,并不会删除它指向的内存对象。这和其他的智能指针是不同的。还是要手动删除它的,QPointer最大的作用还是指针对象被删除后,QPointer 能自动把其内部的指针设为 0,而不是像C++指针一样会变成悬空指针,可以在使用QPointer 对象做一下判断。释放QPointer的方法是使用delete。

QSharedDataPointer(提升程序效率的,待使用)

QSharedDataPointer 这个类是帮我们实现数据的隐式共享和写时拷贝的。

QWeakPointer

QWeakPointer类持有对共享指针的弱引用,QWeakPointer 是为配合 QSharedPointer 而引入的一种智能指针,它更像是 QSharedPointer 的一个助手(因为它不具有普通指针的行为,没有重载operator*和->)。它的最大作用在于协助 QSharedPointer 工作,像一个旁观者一样来观测资源的使用情况。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值