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.
因此,如果您的分配器在重新分配时抛出异常,这就违反了所要求的合同,无论如何所有的赌注都会被取消。
考虑一些使用动态内存(即 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.
因此,如果您的分配器在重新分配时抛出异常,这就违反了所要求的合同,无论如何所有的赌注都会被取消。