qsharedpointer:C++智能指针

在C++中,指针是一种非常常用的数据类型,它能够让我们方便地访问和修改内存中的变量。但是,指针的使用也是非常容易出错的,比如可能会忘记释放内存、指针悬空等等。在这种情况下,智能指针就应运而生,它是一种可以自动管理内存的指针,能够在不需要使用指针时自动释放资源,从而避免了一部分的错误。qsharedpointer是Qt框架提供的一种智能指针,它具有极高的灵活性和安全性,并且非常适用于Qt开发。

一、构造函数和析构函数

qsharedpointer的主要实现是利用了引用计数机制,它记录了有多少个指针指向了同一个对象,并且会在最后一个指针结束生命周期的时候自动的释放资源。qsharedpointer提供了多种构造函数和析构函数,这些函数可以根据不同的需求进行选择。下面是qsharedpointer的最基本的构造函数和析构函数,它们可以创建和销毁一个指向一个对象的智能指针。


template QSharedPointer::QSharedPointer(T *ptr = Q_NULLPTR) : d(new Data(ptr)) {}
template QSharedPointer::~QSharedPointer() { d->ref.ref() == 1 ? delete d->ptr : d->ref.deref(); delete d; }

这里需要注意的是,qsharedpointer的构造函数可以接受一个指向某个对象的原始指针,也可以没有参数,此时它将会创建一个空指针。同时qsharedpointer的析构函数会在不需要使用指针时自动释放资源,它的实现方式是通过引用计数机制实现的。在析构函数中,我们可以看到d->ref.ref()的执行,它会将引用计数减1,从而保证了对象的正确释放。

二、拷贝构造函数和移动构造函数

qsharedpointer提供了拷贝构造函数和移动构造函数,它们可以将一个已有的智能指针复制或者移动到一个新的智能指针中。同时,qsharedpointer还提供了一些辅助函数,如reset函数、swap函数等。

1.拷贝构造函数


QSharedPointer(const QSharedPointer &other) : d(other.d) { d->ref.ref(); }

拷贝构造函数将会复制一个已存在的智能指针,并且增加引用计数。在函数中,我们可以看到直接将other的私有数据d复制到了当前对象的私有数据d中,并且增加了一次引用计数,避免了指针的重复释放。需要注意的是,在拷贝构造函数中,我们没有增加原始指针的引用计数,这是因为我们并不知道other中的指针是否是下面的原始指针,如果这里增加一次引用计数,那么可能就会导致一些错误的结果。

2.移动构造函数


QSharedPointer(QSharedPointer &&other) Q_DECL_NOEXCEPT : d(other.d) { other.d = Q_NULLPTR; }

移动构造函数允许我们将一个已有的智能指针的所有权移动到一个新的智能指针中。在函数中,我们可以看到将other的私有数据d赋值给了当前对象的私有数据d,并且设置other的私有数据d为null。这里需要注意的是,other在函数执行完之后不应当再使用,因为它所指向的资源已经被移动走了。

三、示例代码

下面是一个简单的例子,我们首先创建一个普通的指针,然后将它转换为智能指针,并且进行引用计数的测试:


#include <QSharedPointer>

int main() {
    int *a = new int(10);
    QSharedPointer ptr(a);
    QSharedPointer ptr1(ptr);
    ptr1.reset(new int(20));
    qDebug() << *ptr << *ptr1;
}

在上面的代码中,我们首先创建了一个指针a,然后将它转换为智能指针ptr,并且创建了另外一个智能指针ptr1,这里使用了拷贝构造函数。接着,我们调用了reset函数,将ptr1指向了一个新的int变量。最后输出了ptr和ptr1所指向的变量值。我们可以看到,在ptr1指向新的int变量之后,ptr所指向的变量依然是原来的int变量(值为10),因为它们所指向的资源是不同的。

四、总结

在这篇文章中,我们对qsharedpointer进行了详细的阐述。它是一种非常优秀的智能指针,能够在不需要使用指针时自动释放资源,避免了一部分的错误。它实现了引用计数机制,能够正确地管理内存,同时还提供了拷贝构造函数、移动构造函数、reset函数、swap函数等辅助函数,非常方便实用。在Qt开发中,qsharedpointer也是非常流行的一种指针类型,它被广泛地应用于内存管理、线程控制等方面,是开发者不可或缺的一种重要工具。

原创文章,作者:EZXMP,如若转载,请注明出处:https://www.506064.com/n/369251.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
EZXMPEZXMP
上一篇 2025-04-12 13:00
下一篇 2025-04-12 13:00

相关推荐

  • 华为打造的歌:从卡拉OK到智能音乐平台

    华为打造的歌是一款智能音乐平台,旨在打造一个汇聚优质音乐、歌手和乐迷社群的平台。该平台依托华为强大的技术实力和广泛的生态伙伴网络,为用户提供全方位的音乐生态服务,包括在线K歌、语音…

    编程 2025-04-29
  • 指针Python:为什么Python中不需要使用指针?

    在Python中,指针的使用不像其他语言一样那么常见。这是因为Python有自己的内存管理方式,所以在大多数情况下,不需要显式地使用指针。那么,为什么Python中不需要使用指针呢…

    编程 2025-04-29
  • 智能风控 Python金融风险PDF

    在金融交易领域,风险控制是一项重要任务。智能风控是指通过人工智能技术和算法模型,对金融交易进行风险识别、风险预警、风险控制等操作。Python是一种流行的编程语言,具有方便、易用、…

    编程 2025-04-29
  • Oliver Assurance:可靠、智能的保险解决方案

    Oliver Assurance是一家基于人工智能技术的保险解决方案提供商。其旨在通过技术手段,让保险行业更加透明、高效、可靠。下面我们将从多个方面对Oliver Assuranc…

    编程 2025-04-28
  • Python智能测评系统答案解析

    Python智能测评系统是一款用于自动批改Python代码的工具,它通过较为底层的方法对代码进行分析,在编译和执行代码时自动判断正确性,从而评估代码的得分情况。下面将从多个方面对P…

    编程 2025-04-27
  • 使用botgo打造智能交互机器人

    本文将针对botgo进行详细介绍和阐述,帮助读者了解并掌握如何使用botgo打造智能交互机器人,从而提升人机交互的体验。 一、安装与配置botgo 1、首先,安装botgo: np…

    编程 2025-04-27
  • 推推火智能获客系统详细阐述

    一、系统概述 推推火智能获客系统是一款通过深度学习与数据挖掘技术,帮助企业实现智能获客并提升营销效果的SaaS云服务平台。该系统有多个子模块,包括数据中心、智能推送、定制化服务、效…

    编程 2025-04-25
  • 哨兵1号:一款全能的智能机器人

    一、多功能机器人 作为一款全能的智能机器人,哨兵1号可以执行多项任务。它可以根据预先设定的路径进行巡逻,并且可以在需要时使用其高清摄像头和红外传感器来检测周围的环境。除此之外,哨兵…

    编程 2025-04-24
  • 智能送药小车

    一、设计思路 智能送药小车是一种全自动化的小型车辆,能够在医院内部自主导航、收集并分发药品,大大提高医院的药品配送效率,减轻医护工作负担。 整个小车由以下模块构成: – 报警模块:…

    编程 2025-04-24
  • 基于知识图谱的智能问答系统

    基于知识图谱的智能问答系统(QA)是一种信息处理系统,它能够自动回答用户提出的问题。大多数传统的QA系统是基于模式匹配的,并未考虑到语言的语义,因此只能回答一些结构化的问题。但是,…

    编程 2025-04-22

发表回复

登录后才能评论