【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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值