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

问题描述 投票:0回答:2

我正在阅读一本书中有关智能指针的内容,其中指定不允许抛出自定义删除器。但我无法弄清楚其中的原因。为什么不让他们扔?

c++ smart-pointers custom-deleter
2个回答
0
投票

没有语言限制要求删除器不抛出异常。但是,智能指针所持有的删除器预计会在智能指针被破坏时运行,这可能是在

throw
catch
之间的堆栈展开期间。

如果你的删除器在这种情况下抛出异常,并且它没有被智能指针的析构函数捕获(

std::unique_ptr
std::shared_ptr
不会),那么有一个语言规则来处理
std::terminate
这个过程。


0
投票

这是标准委员会做出的决定。 他们本来可以做出其他决定。事实上,如果您创建自己的自定义版本,例如

throwing_unique_ptr
,你可以让它允许这一点。 这一决定对标准智能指针版本有利有多种原因:

  • 它允许在标记为
    noexcept
  • 的函数中使用智能指针
  • 它减少了代码大小,因为每次使用智能指针时都不必生成异常处理(堆栈展开)代码(这可能很重要,因为智能指针无处不在)
  • 使用抛出析构函数很少是一个好主意,因此这可以阻止程序员创建糟糕的设计。在绝大多数情况下,未能释放资源是一个编程错误,中止执行是适当的(参见例如
    free
    ,它也返回 void)。
© www.soinside.com 2019 - 2024. All rights reserved.