是否可以保证std::vector
的元素从最后到第一个被销毁?
答案 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)
不,是对数组的保证,其中构造的所有元素都是顺序并以相反的顺序销毁。这与处理全局对象的方式有些一致。
另一方面,容器成员可以使用例如insert
和erase
成员函数以任何顺序构造和销毁。为了在某种程度上保持一致并以相反的构造顺序销毁元素,这将要求容器在这些变化上保留某种记录。显然这会很贵!
最好的办法是容器析构函数调用clear()
,它被定义为erase(begin(), end())
,但我也找不到任何要求。该标准仅表65中的“线性复杂性”。