Shared_ptr and unique_ptr with exception

Shared_ptr and unique_ptr with exception

本文关键字:ptr exception with and Shared unique      更新时间:2023-10-16

From en.cppreference.com

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

  • 提供异常安全处理具有动态生存期的对象的类和函数,通过保证正常退出和异常退出时

    删除
  • 将具有动态生存期的唯一拥有对象的所有权传递给功能

  • 获取具有动态生存期的唯一拥有对象的所有权从函数

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

我对第一点感兴趣。

cppreference.com 中没有提到shared_ptr。我找不到在引发异常时shared_ptr不会被删除的情况。有人可以解释是否存在这种可能性吗?

让我们看看如何使用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可以以同样的方式提供异常安全吗?是的,可以。但它不应该,因为它是为不同的目的而设计的,并且会产生不必要的开销。因此,在这种情况下,它没有作为工具提及,但这并不意味着如果它是唯一的所有者,它不会删除拥有的对象。

名思义,std::shared_ptr共享它是指针。 如果抛出异常并且保留了范围,则共享指针将被销毁,但如果某处有另一个std::shared_ptr是副本,则不会删除基础指针,而只是减少引用计数器。

这就是为什么他们不能保证删除会发生。 由于std::unique_ptr是独一无二的,因此可以给出保证,因为我们知道它是唯一一个抓住指针的人。