zoukankan      html  css  js  c++  java
  • C++中的智能指针

    一、动态内存管理

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

    struct BBE{
        int X;
        int Y;
        void show()
        {
            qDebug()<<X<<'	'<<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的源码分析工具,可以检测到内存问题:

      因此,对应的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内存了。

  • 相关阅读:
    IP通信基础学习第八周
    IP通信基础学习第七周(下)
    IP通信基础学习第七周(上)
    IP通信基础学习第六周(下)
    mysql 笔记
    一个不错的MYSQL数据库备份类,PHP版,一个文件,精简版
    Linux下apache日志(按日期存放)分析与状态查看方法
    呵呵
    docker-compose常用命令
    mysql 数据备份
  • 原文地址:https://www.cnblogs.com/pinking/p/9357721.html
Copyright © 2011-2022 走看看