为什么不允许智能指针的自定义删除器抛出异常?

Why custome deleters for smart pointers are not allowed to throw exceptions?

提问人:Infinity 提问时间:10/30/2023 更新时间:10/30/2023 访问量:85

问:

我正在从一本书中读到有关智能指针的信息,其中指定不允许抛出自定义删除器。但我无法弄清楚其中的原因。为什么他们不被允许投掷?

C++ 智能指针 custom-deleter

评论

5赞 Sergey Kolesnik 10/30/2023
智能指针将在其析构函数中调用自定义删除程序。现在你必须问问自己,析构函数中未捕获的异常会导致什么

答:

5赞 Caleth 10/30/2023 #1

智能指针持有的删除器应在智能指针被销毁时运行,这可能是在 a 和 a 之间的堆栈展开期间。throwcatch

如果删除程序在这种情况下抛出,并且智能指针的析构函数未捕获它,则为了避免两个异常同时处于动态状态,该过程有一个语言规则。std::terminate

和 do 的具体情况有一个前提条件,即删除者在调用它时绝不能抛出,在未定义行为的痛苦下,但他们不要求它被标记。std::unique_ptrstd::shared_ptrnoexcept

评论

0赞 Yksisarvinen 10/30/2023
实际上,要求删除器是非抛出的:eel.is/c++draft/util.smartptr.shared#const-10。 似乎没有这样的要求,可能是因为每个可以调用它的地方都已经存在了。std::shared_ptrstd::unique_ptrnoexcept
0赞 Caleth 10/30/2023
@Yksisarvinen谢谢。如果删除器抛出,两者最终都会得到 UB,因为这是你违反前提条件所得到的,并且直接调用它shared_ptrunique_ptr
0赞 Red.Wave 10/30/2023
@Yksisarvinen只是短路。它不提供任何保证。所以双掷UB仍然是问题所在。noexcepttry{/*...*/} catch(...){/*noop*/};
2赞 Caleth 10/30/2023
@Red.Wave不,就像noexcepttry{ ... } catch { std::terminate(); }
0赞 Red.Wave 10/31/2023
@Caleth是的,我的错。我更关心的是堆栈展开。忘了那个。