• 【C++笔记】C++中常见智能指针auto_ptr、unique_ptr、shared_ptr和weak_ptr的用法


    以下内容仍在更新完善...

    智能指针

      C++没有垃圾回收机制,因此每次使用完new分配内存,都需要手动delete。如果没有delete,可能会导致内存泄漏程序崩溃。

      此时,使用智能指针就可以缓解这个问题。智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。

      C++11中,最常使用的智能指针类型是shared_ptr。它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减1。只有引用计数为0时,智能指针才会自动释放引用的内存资源。

    auto_ptr智能指针

      auto_ptr的简单代码示例:

        

        auto_ptr<string> p1 (new string ("123456"));
    
        auto_ptr<string> p2;
    
        p2 = p1; 

      此时p2获得了p1针对对象的所有权,虽然程序不会报错,但是如果后续程序中出现访问p1的操作则会报错。

    unique_ptr智能指针

      unique_ptr保证同一时间内只有一个智能指针可以指向该对象。

      unique_ptr的简单代码示例:

      

        unique_ptr<string> p3 (new string ("auto")); 
    
        unique_ptr<string> p4;
    
         p4 = p3;   //程序会报错,因为unique_ptr具有独占性

    shared_ptr智能指针

      shared_ptr智能指针类型拥有以下成员函数:

      use_count   返回引用计数的个数

      unique      返回是否是独占所有权( use_count 为 1)

      swap      交换两个 shared_ptr 对象(即交换所拥有的对象)

      reset       放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少

      get        返回内部对象(指针)

      shared_ptr的简单代码示例:

      

      int main()
    
      {
    
        string *s1 = new string("12");
    
        shared_ptr<string> ps1(s1);
    
        shared_ptr<string> ps2;
    
        ps2 = ps1;                                                  //两个指针指向同一对象
    
     
    
        cout << ps1.use_count()<<endl;             //2
    
        cout<<ps2.use_count()<<endl;               //2
    
        cout << ps1.unique()<<endl;                   //0,表示ps1不独占所有权
    
        ps1.reset();                                               //放弃ps1的拥有权,引用计数减少
    
        cout << ps1.use_count()<<endl;             //0
    
        cout<<ps2.use_count()<<endl;               //1
    
        cout << ps2.unique()<<endl;                   //1,表示ps2独占所有权
    
        return 0;
    
      }  

    weak_ptr智能指针

      weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象。它作为弱引用指针,其实现依赖于counter的计数器类和share_ptr的赋值。

      weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针。 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少。

      weak_ptr是用来解决 shared_ptr 相互引用时的死锁问题,如果说两个 shared_ptr 相互引用,那么这两个指针的引用计数永远不可能下降为0,资源永远不会释放。它是对对象的一种弱引用,不会增加对象的引用计数,和 shared_ptr 之间可以相互转化,shared_ptr 可以直接赋值给它,它可以通过调用lock函数来获得 shared_ptr。 

      

  • 相关阅读:
    Java的native关键字---JAVA下调用其他语言的关键词
    JAVA关键词synchronized的作用
    Ubuntu下安装android studio的时候,无法进入图形界面--/usr/lib/jdk1.8.0_60/jre/lib/i386/libawt_xawt.so: libXtst.so.6: 无法打开共享对象文件: 没有那个文件或目录
    安装XP和Ubuntu双系统问题——Ubuntu安装时无法识别原有系统
    耗时又繁重的SQL诊断优化,以后就都交给数据库自治服务DAS吧!
    阿里云发布政企安全加速解决方案 加码助力政企信息化安全
    Nacos 权限控制介绍及实战
    资深技术专家崮德在阿里管理研发团队的实践和思考
    容灾切换必备——全局流量管理介绍
    MaxCompute管家详解--管家助力,轻松玩转MaxCompute
  • 原文地址:https://www.cnblogs.com/Neko-YG/p/13341100.html
Copyright © 2020-2023  润新知