如果我在向量中动态分配类的对象,是否使用clear()调用每个对象的析构函数?
答案 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
的元素,并可能使过去的迭代器无效。