0

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

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

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

我可以确定上述状态中的容器永远不会要求std::terminate销毁吗?

4

1 回答 1

4

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

不,这不对。Allocator禁止deallocate投掷的要求。它不是正式的noexcept说明符,但 C++14 表 28 分配器要求说:

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

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

于 2016-01-08T12:11:23.217 回答