std::terminate 和空容器的析构函数

std::terminate and destructors of empty containers

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

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

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

我可以确定处于上述状态的容器永远不会在销毁时调用 std::terminate 吗?

It is possible in case of Allocator::deallocate() throw exception.

不,不是。 Allocator 的要求禁止 deallocate 抛出。它不是正式的 noexcept 说明符,但是 C++14 Table 28 分配器要求说:

a.deallocate(p, n) [...] Does not throw exceptions.

因此,如果您的分配器在重新分配时抛出异常,这就违反了所要求的合同,无论如何所有的赌注都会被取消。