std :: unique_ptr的典型用法包括:
- 在正常退出和退出时删除
提供异常安全 处理具有动态生命周期的对象的类和函数 保证通过例外
将具有动态生命周期的唯一拥有对象的所有权传递给 功能
获取具有动态生命周期的唯一拥有对象的所有权 来自功能
作为移动感知容器中的元素类型,例如std :: vector, 它保存指向动态分配对象的指针(例如,如果 需要多态行为)
我对第一点感兴趣。
cppreference.com中的shared_ptr
没有提及。
我无法找到抛出异常时不会删除shared_ptr的场景。有人可以解释是否存在这种可能性?
答案 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
可以使用相同的方式来提供异常安全吗?是的,它可以。但它不应该,因为它是为不同的目的而设计的,并且会产生不必要的开销。因此,它没有被提及作为此类案例的工具,但并不意味着如果它是唯一的所有者,它不会删除拥有的对象。