std ::空容器的终止和析构函数

时间:2016-01-08 10:21:55

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

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

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

据我所知,容器的所有析构函数都是noexcept。即在销毁期间抛出异常时,他们应该致电std::terminate。如果Allocator::deallocate()抛出异常,则有可能。

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

1 个答案:

答案 0 :(得分:3)

  

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

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

  

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

因此,如果您的分配器抛出重新分配,则违反了所需的合同,并且所有投注都会被取消。