C++中的智能指针

C++中的智能指针

一、动态内存管理

  通常我们创建动态内存的时候,需要自己管理好内存,也就是说,new出来的对象一定要注意释放掉。下面通过例子可以看到这个问题所在:

struct BBE{
    int X;
    int Y;
    void show()
    {
        qDebug()<<X<<'\t'<<Y<<endl;
    }
};

void test()
{
    BBE *n = new BBE;
    n->X = 10;
    n->Y = 20;
    n->show();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    test();
    return a.exec();
}

  我们通过Qt中的Clang Static Analyzer的源码分析工具,可以检测到内存问题:

<span>C++中的智能指针</span>

  因此,对应的new 出来的动态内存要注意释放掉,

void test()
{
    BBE *n = new BBE;
    n->X = 10;
    n->Y = 20;
    n->show();
    delete n;
    n = NULL;
}

  如上即可,释放掉内存的指针习惯指向NULL,防止出现悬空指针

二、野指针与悬空指针

  A pointer in c which has not been initialized is known as wild pointer.  —- 野指针

  If a pointer still references the original memory after it has been freed, it is called a dangling pointer.  —- 悬空指针

三、智能指针

  本文以Qt中提供的智能指针为例,首先,智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象。通过这一方法实现对内存的管理功能。

  在上面的例子中,可以改为代码:

void test()
{
    QSharedPointer<BBE> n(new BBE);
    n->X = 10;
    n->Y = 20;
    n->show();
}

  可以看到,使用智能指针的话,不需要手动delete内存了。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119445.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月20日 上午7:00
下一篇 2021年11月20日 上午8:00


相关推荐

  • dotnet Docker 部署

    dotnet Docker 部署相关工具 使用 xshell 连接 linux 执行命令 1 dotnetfordoc 安装 在 xshell 中执行 dockerpullmc microsoft com dotnet core sdk 不要百度搜索命令 请找 Docker 官网查找 百度搜到的命令可能已过期 2 WebApi 工程文件 添加 Dockerfile 文件 FROMmcr microsoft co

    2026年3月18日
    2
  • Pycharm—修改背景颜色和背景图片

    Pycharm—修改背景颜色和背景图片文章目录一 修改背景颜色二 修改背景图片一 修改背景颜色 1 单击 File gt Settings2 单击 Editor gt ColorScheme gt 选择 Scheme 注意这里的 ColorScheme 是单击 不要点击左边的小三角 3 点击右下 Apply gt Yes 大功告成 二 修改背景图片 1 打开 Settings2 点击 Appearance amp Behavior gt

    2026年3月27日
    3
  • python安装教程(Windows系统,python3.7为例)「建议收藏」

    python安装教程(Windows系统,python3.7为例)「建议收藏」1.在python的官网下载python对应版本:https://www.python.org/downloads/windows/    64位下载Windowsx86-64executableinstaller版本   32位下载Windowsx86executableinstaller版本   打开链接如下图,版本会一直更新,选择任意一个适合自己电脑的版本就好2…

    2022年6月18日
    30
  • 线程池源码分析_executors源码解析

    线程池源码分析_executors源码解析概述在java中,线程池ThreadPoolExecutor是一个绕不过去的类,它是享元模式思想的体现,通过在容器中创建一定数量的线程加以重复利用,从而避免频繁创建线程带来的额外开销。一个设

    2022年8月16日
    30
  • 现在的SEO最须要会点啥

    现在的SEO最须要会点啥

    2021年11月16日
    39
  • [Mvel]Mvel2.0使用指南一 基础

    [Mvel]Mvel2.0使用指南一 基础MVEL 在很大程度上受到 Java 语法的启发 作为一个表达式语言 也有一些根本的区别 旨在更高的效率 例如 直接支持集合 数组和字符串匹配等操作以及正则表达式 MVEL 用于执行使用 Java 语法编写的表达式 除了表达语言之外 MVEL 还可用作配置和字符串构造的模板语言 MVEL2 x 表达式包含以下部分的内容 属性表达式布尔表达式方法调用变量赋值函数定义 1 基本语法 MVEL 是一种基于 Java 语法

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号