C ++ - 向量保存对象时是否调用析构函数?

时间:2011-06-13 02:54:20

标签: destructor

如果我在向量中动态分配类的对象,是否使用clear()调用每个对象的析构函数?

2 个答案:

答案 0 :(得分:5)

“动态分配”是什么意思?如果您使用vector<foo>,那么您没事。如果你在via vector<foo*>中添加指针,那么析构函数将不会被调用,因为指针本身没有析构函数。

但请注意,在vector<foo>的情况下,您可能会发现您的构造函数和析构函数比您预期的要多得多,例如当向量调整大小时,因为如果需要,向量将在内存中移动对象时使用它们。您可以使用Boost shared_ptr来解决这个问题,尽管由于引用计数簿记而导致费用很小。

我的建议:如果对象的复制和销毁价格便宜,请使用vector<foo>;如果价格昂贵或难以/无法复制,请vector<shared_ptr<foo> >使用vector<foo*>。除非你特别想避免让向量处理内存管理,否则永远不要使用{{1}},然后才要小心;恕我直言,这不是一个好主意。

答案 1 :(得分:1)

是的,它们都已正确清理。

来自this link

  

向量的所有元素都被删除:调用它们的析构函数,然后从向量容器中删除它们,使容器的大小为0.

即将推出的标准的[sequence.reqmts]部分也明确了这一点:

  

a.clear()销毁a中的所有元素,使所有引用,指针和迭代器无效,引用a的元素,并可能使过去的迭代器无效。