C++ 智能指针auto_ptr、unique_ptr、shared_ptr、weak_ptr

转自: https://www.nowcoder.com/tutorial/93/a34ed23d58b84da3a707c70371f59c21

   智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。
  1. auto_ptr(c++98的方案,cpp11已经抛弃)

采用所有权模式

auto_ptr p1(new string("I"));
auto_ptr p2;
p2 = p1;  //此处不会报错,但是再访问p1将会报错

p2剥夺了p1的所有权,auto_ptr的缺点就是存在崩溃的风险。

  1. unique_ptr(替换auto_ptr)
    unique_ptr 实现独占式拥有或严格拥有的概念,保证同一时间只有一个智能指针可以指向该对象。
auto_ptr p1(new string("I"));
auto_ptr p2;
p2 = p1;  //此处报错

编译器认为p2 = p1 非法, 避免了p3不再指向有效数据的问题。如果想要将unique_ptr赋值给另一个unique_ptr时,C++有一个标准库函数std::move(),让你能够将一个unique_ptr赋给另一个。

  1. shared_ptr
    shared_ptr实现共享式拥有概念。多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。可以通过成员函数use_count()来查看资源的所有者个数,除了可以通过new来构造,也可以通过auto_ptr, unique_ptr, weak_ptr来构造。当调用release()时,当前指针会释放资源所有权,计数减一。当计数为0时,资源会被释放掉。

  2. weak_ptr
    weak_ptr 是一种不控制对象生命周期的智能指针,它指向一个shared_ptr管理的对象,协助shared_ptr工作,它的构造和析构不会引起引用记数的增加或减少。weak_ptr是用来解决shared_ptr相互引用时的死锁问题,如果说两个shared_ptr相互引用,那么这两个指针的引用计数永远不可能下降为0,资源永远不会释放。它可以通过调用lock函数来获得shared_ptr,不能通过weak_ptr直接访问对象的方法。

你可能感兴趣的:(个人mark,C++)