可能是重复问题:
STL容器元素销毁顺序
是否保证一个std::vector
的元素将从后往前被销毁?
2003:5.3.5/6提到了delete[]
:
删除表达式将会调用被删除对象或数组元素的析构函数(如果有的话)。对于数组,元素的销毁顺序是地址递减的顺序(也就是以它们构造完成的相反顺序进行销毁;见12.6.2)。
所以如果你的std::vector
对象的分配器使用了delete[]
,那么它会按照相反的顺序销毁元素。
然而,并没有保证你的std::vector
会以这种方式工作(实际上很可能不会),我也找不到任何特定于容器的引用。
事实上,我认为这完全取决于你的分配器,2003:20.1.5(列出了对分配器施加的要求)似乎没有任何相关说明。
std::vector
不会使用delete[]
,因为一个合理的实现需要额外分配但未初始化的空间,而这些空间上的构造函数尚未运行(因此也就不应该执行析构函数)。 - Ben Voigtallocator_traits<allocator_type>::construct
和 allocator_traits<allocator_type>::destroy
,它们默认情况下分别是放置构造函数和显式析构函数调用的包装器。 - Ben Voigtdelete[]
就不会销毁对象,只有char
...所以你无法推断对象如何被销毁。 - Ben Voigtdelete[]
来删除包含其元素的T类型数组,实际上它是不会这样做的。你无法实现一个分配器类,一次性delete[]
整个数组,因为vector需要逐个destroy
它们。唯一的出路是“as-if”规则——如果vector使用默认分配器,则我想它可能会delete[]
,但这将取决于该实例的历史记录,因为vector::resize()
仍然必须以某种方式实现。 - Steve Jessop
std::vector
仅通过op[]
语法模拟数组;这并不意味着有任何元素生命周期的保证。 - Lightness Races in Orbit