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

  

原文地址:https://www.cnblogs.com/Neko-YG/p/13341100.html