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

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

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

采用所有权模式

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

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

  1. unique_ptr(替换auto_ptr)
    unique_ptr 实现独占式拥有或严格拥有的概念,保证同一时间只有一个智能指针可以指向该对象。
auto_ptr<string> p1(new string("I"));
auto_ptr<string> 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直接访问对象的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值