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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pr曲线 roc曲线_roc曲线与auc的含义

    pr曲线 roc曲线_roc曲线与auc的含义评价指标系列PR曲线查准率和查全率PR曲线绘制ROC曲线TPR,FPR插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入PR曲线AUC就是衡量学习器优劣的一种性能指标。从定义可知,AUC可通过对ROC曲线下各部分的面积求和而得。查准率和查全率查准率,表示所有被预测为正类的样本(TP+F

    2022年10月20日
    2
  • 驱动程序vmci.sys版本不正确。请尝试重新安装 VMware

    驱动程序vmci.sys版本不正确。请尝试重新安装 VMware

    2022年2月22日
    21
  • 联合索引(多列索引)[通俗易懂]

    联合索引(多列索引)[通俗易懂]联合索引是指对表上的多个列进行索引,联合索引也是一棵B+树,不同的是联合索引的键值数量不是1,而是大于等于2.最左匹配原则假定上图联合索引的为(a,b)。联合索引也是一棵B+树,不同的是B+树在对索引a排序的基础上,对索引b排序。所以数据按照(1,1),(1,2)……顺序排放。对于selete*fromtablewherea=XXandb=XX,显然是可以使用…

    2022年6月3日
    76
  • intentservice使用(Intention)

    IntentService,更好用的Service说起IntentService就需要先了解一下Service。Service是长期运行在后台的应用程序组件。Service不是一个单独的进程,它和应用程序在同一个进程中,Service也不是一个线程,它和线程没有任何关系,所以它不能直接处理耗时操作。如果直接把耗时操作放在Service的onStartCommand()中,…

    2022年4月18日
    35
  • JavaScript高级知识总结(高级篇)[通俗易懂]

    JavaScript高级知识总结(高级篇)[通俗易懂]目录一、深入基础1.1数据类型1.分类:2.判断:3.undefined与null的区别?4.严格区别变量类型与数据类型?1.2数据变量与内存1.什么是数据?2.什么是内存?3.什么是变量?4.内存,数据,变量三者之间的关系5.vara=xxx;a内存中到底保存的是什么?6.关于引用变量的赋值问题:7.在js调用函数时传递变量参数时,是值传递还是引用传递?8.js引擎如何管理内存1.3对象1.什么是对象?2.为什么用对象?

    2025年7月16日
    4
  • J2me开发大致框架「建议收藏」

    J2me开发大致框架「建议收藏」J2me开发名目繁多.但大致框架还算有规律可寻,我根据开发经验给大家提点意见,做下总结:游戏的结构很多,不过基本上都是在一个游戏主循环内实现。程序里面的主循环包含了程序框架的最主要的结构体。J2me的程序一般都包含两个class文件,一个是MIDlet,一个是Displayable。一般我都是把游戏的主要代码放在Displayable这个类里面。这个类是基

    2022年7月27日
    6

发表回复

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

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