【问题标题】:std::terminate and destructors of empty containers空容器的 std::terminate 和析构函数
【发布时间】:2016-04-12 23:48:08
【问题描述】:

考虑一些使用动态内存(即AllocatorAwareContainer)并且大小和容量为零的标准容器。例如,获取std::vector 并致电vec.resize(0); vec.shrink_to_fit();

我想这样的容器实例将只包含用于其逻辑内容的nullptr 指针和用于跟踪size 等信息的std::size_t 成员。我还想他们的析构函数基本上什么都不做,因为没有动态内存要释放。

据我所知,所有容器的析构函数都是noexcept。 IE。在销毁期间抛出异常时,他们应该调用std::terminate。在Allocator::deallocate()的情况下有可能抛出异常。

我能否确定处于上述状态的容器不会在销毁时调用std::terminate

【问题讨论】:

  • 对不起,你能改写前两段吗?我无法理解它的要求。
  • @Arunmu 不确定。我使用谷歌翻译,这就是我能从他那里得到的一切。
  • @Arunmu 如果问题的表述真的很糟糕,您可以投票结束它。
  • 我真的不想那样做。您能否尝试提供另一个带有小 cmets 的代码示例。如果那更清楚,那么我可以编辑问题。
  • 我改写了开头的段落,如果您不喜欢这些更改,请随时回滚。

标签: c++ c++11 stl noexcept exception-safety


【解决方案1】:

Allocator::deallocate()抛出异常的情况下是可能的。

不,不是。 Allocator 的要求禁止 deallocate 扔。这不是一个正式的 noexcept 说明符,而是 C++14 表 28 分配器要求说:

a.deallocate(p, n) [...] 不抛出异常。

因此,如果您的分配器抛出解除分配,则违反了所需的合同,无论如何所有赌注都将被取消。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2012-11-05
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多