Shared_ptr and unique_ptr with exception
Shared_ptr and unique_ptr with exception
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
是独一无二的,因此可以给出保证,因为我们知道它是唯一一个抓住指针的人。
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 为重写std::exception的库生成swig接口时出错
- 什么是 std::exception::what() 以及为什么要使用它?
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 链表"exception thrown"
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- C++ broken_promise exception
- 请参阅在 Visual Studio 2019 中捕获 std::exception 时对函数模板实例化消息的引用
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- QVTKWidget SetRenderWindow() with PCLVisualizer Exception