std::矢量元素的销毁顺序

Order of destruction of elements of an std::vector

本文关键字:顺序 元素 std      更新时间:2023-10-16

可能重复:
STL容器元件销毁订单

有没有保证std::vector的元素从最后到第一都会被破坏?

2003:5.3.5/6关于delete[]:

delete表达式将调用要删除的对象或数组元素的析构函数(如果有的话)。在数组的情况下,元素将按照地址递减的顺序被销毁(即,按照其构造函数完成的相反顺序;见12.6.2)

因此,如果您的std::vector对象的分配器使用delete[],那么,是的,它必然会以相反的顺序销毁元素。

然而,不能保证你的std::vector会以这种方式工作(事实上,它很可能不会),而且我找不到任何特定于容器的引用。

实际上,我认为这一切都取决于您的分配器,2003:20.1.5(列出了对分配器的要求)似乎没有说明任何问题

否,对数组有保证,其中所有元素都是按顺序构建并按相反顺序销毁的。这与全局对象的处理方式有些一致。

另一方面,容器成员可以使用例如inserterase成员函数以任何顺序构造和销毁。为了在某种程度上保持一致并以相反的构建顺序销毁元素,这将需要容器对这些更改保持某种日志记录。显然这会很贵!

最好的选择是容器析构函数调用clear(),它被定义为erase(begin(), end()),但我也找不到任何要求。该标准仅在表65中说明了"线性复杂性"。

他们的标准为原始数组保证了这一点,但我找不到任何能为容器保证这一点的东西。

来自[expr.delete](C++0x的新措辞):

如果删除表达式的操作数值不是空指针值,则删除表达式将调用要删除的对象或数组元素的析构函数(如果有的话)。在数组中,元素将按地址递减的顺序(即按完成的相反顺序)销毁建造商;见12.6.2)。

std::vector(事实上,标准库中的所有容器,可能不包括std::array)不使用delete[]来销毁元素(它们在每个元素上单独使用allocator_traits<allocator_type>::destroy),因此上述保证不适用。我在std::vector或容器上找不到关于删除顺序的任何限制。对于某些容器,这样的保证将非常昂贵(例如,std::forward_list不能反向迭代元素来删除它们,std::map不记得添加对的顺序)。

来自[container.requirements.general](C++0x措辞):

对于本子条款中声明分配器类型的组件,存储在组件应使用allocator_traits::construct函数和使用allocator_traits::destroy函数销毁(20.6.8.2)。

相关文章: