我正在使用C++ std向量來存儲渲染對象,用於簡單的場景圖實現。我需要能夠在運行時從場景圖中添加和刪除渲染對象.Adding不是問題,爲了消除:閱讀向量和其他C++容器的文檔,看起來當對象被彈出時,它們的析構函數被調用。這不是我需要的,因爲我希望能夠稍後將這些對象重新添加到渲染循環中。是否可以解決這個問題? 重要細節我忘記提及 - 我正在使用指向渲染對象的向量。從C++容器中刪除對象而不刪除它們
回答
看起來你很迷惑對象實例的基本概念。當你添加了一些爲向量,你不將其移動到它,你把它複製:
vector<string> vec;
string s;
vec.push_back(s);
vec[0]
是不s
,它是s
副本。所以當你從矢量中刪除它時,s
是而不是受到影響。
如果你不想要副本,你應該切換到指針。你可以從vector中移除指針,它們指向的對象的析構函數將不會被調用。
編輯: 好吧,看來你已經在使用指針了。你說:
矢量和其他C++集裝箱閱讀文檔,似乎當 對象被彈出他們的析構函數被稱爲
這是事實。當你從向量中移除一個指針時,指針正在被破壞。這就是文檔的意思。這並不意味着要被被破壞掉的對象指針指向:
vector<string*> vec;
string s;
vec.push_back(&s);
vec.pop_back();
s
完全沒有受到影響。流行操作破壞的是指針,其地址爲s
,而不是s
本身。
所以你很好。
是的,我知道它:)我忘了提及我正在使用指針向量。 –
@MichaelIV:指針會被銷燬,但是他們指向的東西不會。 (只要你正確地管理被指向的對象的生命週期,你就沒事了)。 – Mankarse
@MichaelIV然後你沒有問題;當你從向量中移除指針時,只有指針被銷燬,而不是指針指向的對象。 –
您需要注意所有權才能使其正常工作。如果您使用的矢量只是臨時的,只能觀察對象,則只需使用點矢量即可。
std::vector<object*> x;
銷燬該vector
指向的對象不受影響。
如果要共享所有權,請使用boost::shared_ptr
或std::shared_ptr
。
當指針被彈出時,不會調用析構函數。從概念上講,即使是原始類型也有析構函數,以解釋當它們超出範圍時會發生什麼。銷燬指針向量與使一堆本地指針變量超出範圍相同。
引用計數智能指針是過載運算符*
和->
的對象,其行爲與指針類似。他們確實實施了析構函數來銷燬指向對象,從而實現所有權。但對於場景圖,這可能是不必要的。
- 1. 從數組中刪除對象而不從數據庫中刪除它
- 2. 如何從boost :: ptr_vector中刪除指針而不刪除對象?
- 3. 從列表中刪除項目不從RecyclerView中刪除它們?
- 4. 從活動記錄關係中刪除對象而不刪除它
- 5. ArrayLists的對象,如何添加/從對象中刪除它們?
- 6. 刪除刪除了關聯對象,而在數據庫中刪除它
- 7. Django的 - 刪除對象,而不刪除其相關對象
- 8. 休眠 - 刪除對象引用而不刪除對象
- 9. 休眠刪除對象而不刪除相關對象
- 10. 循環對象,然後刪除它們
- 11. 從UITableView中刪除項目(不刪除它們)
- 12. 刪除單元而不移動它們
- 13. 刪除從Rails管理列表,而不從實際的博客刪除它們
- 14. 從對象中刪除值而不改變它
- 15. 如何刪除文件的內容而不刪除它自己?
- 16. 如何從行對象中刪除行,而不是從數據庫中刪除?
- 17. 如何從服務中刪除吊艙而不刪除它
- 18. 刪除C++中的對象;
- 19. 是否可以從上下文中刪除託管對象,而不是從對多關係中刪除它NSSet
- 20. 如何隱藏記錄,而不是刪除它們(從頭開始軟刪除)
- 21. 從容器中刪除元素時,通過它們迭代
- 22. 從MEF容器中刪除
- 23. 何時從C++堆中刪除對象?
- 24. 從對象中刪除空數組-c
- 25. 從C++列表中刪除對象
- 26. C++從內存中刪除對象
- 27. 顯示LinkedStack的內容而不刪除它們
- 28. 從CoreData中刪除對象
- 29. 從JSONArray中刪除對象
- 30. 從對象中刪除值
存儲從其他地方管理的對象的智能指針。 – juanchopanza
刪除它們之前不會複製它們是一種解決方案嗎?或者,在C++ 11的情況下,將它們移出? – jogojapan
@juanchopanza我會說「智能指針」或「從其他地方管理」,看不出這兩者如何混合。 – Kos