提问人:Infinity 提问时间:10/30/2023 更新时间:10/30/2023 访问量:85
为什么不允许智能指针的自定义删除器抛出异常?
Why custome deleters for smart pointers are not allowed to throw exceptions?
答:
5赞
Caleth
10/30/2023
#1
智能指针持有的删除器应在智能指针被销毁时运行,这可能是在 a 和 a 之间的堆栈展开期间。throw
catch
如果删除程序在这种情况下抛出,并且智能指针的析构函数未捕获它,则为了避免两个异常同时处于动态状态,该过程有一个语言规则。std::terminate
和 do 的具体情况有一个前提条件,即删除者在调用它时绝不能抛出,在未定义行为的痛苦下,但他们不要求它被标记。std::unique_ptr
std::shared_ptr
noexcept
评论
0赞
Yksisarvinen
10/30/2023
实际上,要求删除器是非抛出的:eel.is/c++draft/util.smartptr.shared#const-10。 似乎没有这样的要求,可能是因为每个可以调用它的地方都已经存在了。std::shared_ptr
std::unique_ptr
noexcept
0赞
Caleth
10/30/2023
@Yksisarvinen谢谢。如果删除器抛出,两者最终都会得到 UB,因为这是你违反前提条件所得到的,并且直接调用它shared_ptr
unique_ptr
0赞
Red.Wave
10/30/2023
@Yksisarvinen只是短路。它不提供任何保证。所以双掷UB仍然是问题所在。noexcept
try{/*...*/} catch(...){/*noop*/};
2赞
Caleth
10/30/2023
@Red.Wave不,就像noexcept
try{ ... } catch { std::terminate(); }
0赞
Red.Wave
10/31/2023
@Caleth是的,我的错。我更关心的是堆栈展开。忘了那个。
上一个:Rust 智能指针问题
下一个:创建动态推导类型的智能指针?
评论