Shared_ptr和unique_ptr有异常

时间:2016-02-23 18:40:39

标签: c++ exception shared-ptr unique-ptr

来自en.cppreference.com

  

std :: unique_ptr的典型用法包括:

     
      
  • 提供异常安全   处理具有动态生命周期的对象的类和函数   保证通过例外

  • 在正常退出和退出时删除   
  • 将具有动态生命周期的唯一拥有对象的所有权传递给   功能

  •   
  • 获取具有动态生命周期的唯一拥有对象的所有权   来自功能

  •   
  • 作为移动感知容器中的元素类型,例如std :: vector,   它保存指向动态分配对象的指针(例如,如果   需要多态行为)

  •   

我对第一点感兴趣。

cppreference.com中的shared_ptr没有提及。 我无法找到抛出异常时不会删除shared_ptr的场景。有人可以解释是否存在这种可能性?

2 个答案:

答案 0 :(得分:3)

顾名思义,std::shared_ptr分享它的指针。如果抛出异常并且保留了范围,则共享指针会被销毁,但如果某个地方存在另一个std::shared_ptr,那么底层指针不会被删除,而只会减少参考计数器。

这就是为什么他们无法保证删除会发生的原因。由于std::unique_ptr unique ,因此我们知道它是唯一一个保留指针的保证。

答案 1 :(得分:3)

让我们看一下示例,std::unique_ptr如何用于提供异常安全:

someclass *ptr = new someclass;
...
delete ptr; // in case of exception we have problem

所以我们应该使用:

std::unique_ptr<someclass> ptr = std::make_unique<someclass>();
... // no problem

简单,安全且无开销。

那么shared_ptr可以使用相同的方式来提供异常安全吗?是的,它可以。但它不应该,因为它是为不同的目的而设计的,并且会产生不必要的开销。因此,它没有被提及作为此类案例的工具,但并不意味着如果它是唯一的所有者,它不会删除拥有的对象。