2011-06-13 72 views

回答

1

是的,它們都被正確清理。

this link

向量的所有元素都將被丟棄:他們的析構函數被調用,然後將它們從載體容器移除,留下容器的大小爲0。

即將推出的標準的[sequence.reqmts]節也說明了這一點:

a.clear()破壞所有ELEM在a中使用,導致引用a的元素的所有引用,指針和迭代器無效,並且可能使過去最終的迭代器失效。

5

你的意思是「動態分配」的意思是什麼?如果你使用vector<foo>那麼你很好。如果您通過vector<foo*>放置指針,則析構函數不會被調用,因爲指針本身沒有析構函數。

但是,請注意,在vector<foo>的情況下,您可能會發現構造函數和析構函數的調用比您期望的要多得多,當矢量調整大小時,因爲如果需要的話,矢量將在內存中移動對象時使用它們。您可以使用Boost shared_ptr來解決這個問題,但由於引用計數簿記導致成本很低。

我的建議:使用vector<foo>如果對象便宜複製和銷燬,並且vector<shared_ptr<foo> >如果它們昂貴或難以/不可複製。永遠不要使用vector<foo*>,除非你特別想避免使用矢量處理內存管理,只有這樣才能小心;恕我直言,這很少是一個好主意。

+0

如果使用移動容器中的對象;容器中的對象保留但不應被銷燬。然後會發生什麼? – this 2014-06-05 13:37:16

+0

原來的答案寫在std :: move()之前是常用的。將發生的事情是該物體仍將被銷燬。這實際上就是這種情況,IIRC - 當它們被「移出」並且使它們的析構函數適當地運行時,它們將被追蹤。唯一棘手的部分是,沒有人應該查看移動元素的狀態,直到它被分配一個新值或銷燬。 – 2014-06-06 19:40:12

相關問題