如果我動態地分配一個向量內類的對象,如果我使用clear(),是否每個對象的析構函數都是被調用的?C++ - 當矢量持有對象時調用析構函數嗎?
2
A
回答
1
是的,它們都被正確清理。
向量的所有元素都將被丟棄:他們的析構函數被調用,然後將它們從載體容器移除,留下容器的大小爲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*>
,除非你特別想避免使用矢量處理內存管理,只有這樣才能小心;恕我直言,這很少是一個好主意。
相關問題
- 1. C++矢量對象和過度調用析構函數?
- 2. 當我在extern裏面創建對象時調用C++類析構函數c
- 3. 構造函數和析構函數調用上推到C++矢量
- 4. 當對象超出範圍時,是否調用析構函數?
- 5. 只有當回調函數調用時才生成矢量
- 6. 調用析構函數關閉對象
- 7. 如何添加並初始化矢量中的對象,而不必爲現有對象調用析構函數?
- 8. 當使用C#使用C++對象時析構函數執行PInvoke
- 9. 應該矢量中的所有對象都有複製構造函數嗎?
- 10. 將返回一個對象調用它的析構函數嗎?
- 11. C++析構函數沒有被調用?
- 12. 當在js模塊中定義對象構造函數時,從C調用JS對象構造函數
- 13. 解析JSON時未調用數據對象構造函數
- 14. 調用矢量析構函數或清除不同的線程
- 15. 當我殺死C++中的pThread時,棧上的對象的析構函數會被調用嗎?
- 16. Xerces-C問題;段錯誤調用對象析構函數
- 17. boost :: python包裝對象的C++析構函數調用
- 18. C++堆棧分配對象,顯式析構函數調用
- 19. C++太多的析構函數調用,所以幾個對象
- 20. 使用析構函數刪除成員矢量中的堆分配對象
- 21. 不能調用成員函數沒有對象的矢量shared_ptr的對象
- 22. 當持久層疊時調用非對象的成員函數
- 23. Visual C#中沒有析構函數嗎?
- 24. Java中有C++析構函數嗎?
- 25. 當變量仍然活着時被調用的C++析構函數
- 26. 當調用對象時沒有方法的JS調用函數
- 27. 析構函數,返回臨時對象
- 28. 從對象矢量虛擬函數調用的模板版本
- 29. std :: remove_if調用析構函數嗎?
- 30. c#對象函數調用
如果使用移動容器中的對象;容器中的對象保留但不應被銷燬。然後會發生什麼? – this 2014-06-05 13:37:16
原來的答案寫在std :: move()之前是常用的。將發生的事情是該物體仍將被銷燬。這實際上就是這種情況,IIRC - 當它們被「移出」並且使它們的析構函數適當地運行時,它們將被追蹤。唯一棘手的部分是,沒有人應該查看移動元素的狀態,直到它被分配一個新值或銷燬。 – 2014-06-06 19:40:12