考虑一些使用动态内存的标准容器(即AllocatorAwareContainer)并且其大小和容量为零。例如,选择std::vector
并致电vec.resize(0); vec.shrink_to_fit();
。
我认为这样的容器实例只包含nullptr
个逻辑内容指针,std::size_t
成员跟踪size
之类的信息。我还想象他们的析构函数基本上什么也没做,因为没有动态内存可以被释放。
据我所知,容器的所有析构函数都是noexcept
。即在销毁期间抛出异常时,他们应该致电std::terminate
。如果Allocator::deallocate()
抛出异常,则有可能。
我可以确定上述状态的容器在销毁时不会调用std::terminate
吗?
答案 0 :(得分:3)
在
Allocator::deallocate()
抛出异常的情况下是可能的。
不,不是。 Allocator
禁止deallocate
投掷的要求。它不是正式的noexcept
说明符,但C ++ 14表28分配器要求说:
a.deallocate(p,n)[...]不抛出异常。
因此,如果您的分配器抛出重新分配,则违反了所需的合同,并且所有投注都会被取消。