我正在阅读一本书中有关智能指针的内容,其中指定不允许抛出自定义删除器。但我无法弄清楚其中的原因。为什么不让他们扔?
没有语言限制要求删除器不抛出异常。但是,智能指针所持有的删除器预计会在智能指针被破坏时运行,这可能是在
throw
和 catch
之间的堆栈展开期间。
如果你的删除器在这种情况下抛出异常,并且它没有被智能指针的析构函数捕获(
std::unique_ptr
和std::shared_ptr
不会),那么有一个语言规则来处理std::terminate
这个过程。
这是标准委员会做出的决定。 他们本来可以做出其他决定。事实上,如果您创建自己的自定义版本,例如
throwing_unique_ptr
,你可以让它允许这一点。
这一决定对标准智能指针版本有利有多种原因:
noexcept
free
,它也返回 void)。