std :: vector元素的破坏顺序

时间:2011-05-29 17:09:29

标签: c++ vector destructor

  

可能重复:
  STL containers element destruction order

是否可以保证std::vector的元素从最后到第一个被销毁?

3 个答案:

答案 0 :(得分:17)

2003:5.3.5 / 6说delete[]

  

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

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

但是,无法保证您的std::vector将以这种方式工作(事实上,它很可能没有),而且我找不到任何特定于容器的引用。

真的,我认为这完全取决于你的分配器和2003:20.1.5(列出对分配器的要求)似乎没有任何关于它的说法。

答案 1 :(得分:4)

他们的标准保证了这对于原始数组,但我找不到任何可以保证容器的东西。

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

  

如果delete-expression的操作数值不是空指针值,则delete-expression将为   为对象或要删除的数组的元素调用析构函数(如果有)。在一个案例中   数组,元素将按地址递减的顺序销毁(即完成的顺序相反)   他们的建设者;见12.6.2)。

std::vector(实际上,标准库中的所有容器,可能不包括std::array)不使用delete[]来销毁元素(它们每个都使用allocator_traits<allocator_type>::destroy元素),所以上述保证不适用。我对特定的std::vector或一般的容器没有限制删除的顺序。对于某些容器,这样的保证会非常昂贵(例如std::forward_list不能反向迭代元素以删除它们,std::map不记得添加对的顺序。 / p>

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

  

对于由本子条款声明allocator_type的组件,存储在这些组件中的对象   组件应使用allocator_traits :: construct函数和   使用allocator_traits :: destroy函数(20.6.8.2)销毁。

答案 2 :(得分:4)

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

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

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