我正在研究一個遊戲引擎,它利用了由各種組件組成的actor。這些演員擁有他們的組件,而組件也擁有他們的父演員。我有一個名爲Destroy的成員函數,它打破了循環引用鏈,因此可以清理所有內容。我試圖基本上把所有的東西當做組件來做。例如,即使相機是連接到某些演員的組件。這意味着諸如渲染器之類的東西需要訪問相機組件以便提取它們的視圖和proj矩陣,所以我想在當前活動攝像機的渲染器和它們渲染的窗口中保留一個列表。我不能讓它共享指針,因爲這樣可以防止演員在應該被破壞時被破壞。我不想使用弱指針,因爲它需要鎖定每一幀,以獲得視圖和投影矩陣。所以我打算嘗試使用原始指針,並在使用它之前檢查它是否爲nullptr。不幸的是,這是行不通的。當相機組件的shared_ptr超出範圍時,原始指針保持有效,但只是指向垃圾?我的印象是shared_ptr應該清理它。這是否會成爲我需要定製刪除程序的情況?一個刪除並將值設置爲nullptr的?當他們的shared_ptr死時使用原始指針會發生什麼
回答
當相機組件的shared_ptr超出範圍時,原始指針保持有效,但只是指向垃圾?
然後它不是「有效」;它的晃來晃去。
我的印象是shared_ptr應該清理它。這是否會成爲我需要定製刪除器的情況?一個刪除並將值設置爲nullptr的?
是你期待一個std::shared_ptr
指向一個對象obj
奇蹟般地與價值&obj
到nullptr
將所有原始指針在整個程序?那是不可能的!
這是你的責任NULL指出,否則將懸停。通過與智能指針同時使用原始指針,您向自己保證,您知道自己在做什麼,並保持原始指針的安全,但之後未能如願。
如果您希望「原始指針」不增加引用計數,但指向另外一個智能管理的對象,則使用std::weak_ptr
s。
如果因爲任何原因你不能使用弱指針,那麼,是的,你將不得不將自己的裸指針NULL。定製刪除器將是一個很好的解決方法。
免責聲明:我只讀了你的問題的最後六行。 – 2014-12-02 22:26:35
只讀最後六行,你給我我正在尋找的答案。我要麼必須將所有內容切換爲raw指針,要麼處理使用weak_ptr的「manager」類型對象的開銷。 – user3355098 2014-12-02 22:33:51
@ user3355098:是的。我其實很喜歡你使用自定義刪除器的想法,只要你不會以這種方式陷入混亂。 – 2014-12-02 22:36:19
- 1. 當std :: thread被銷燬時,如果指針指向shared_ptr會發生什麼?
- 2. 對原始指針使用typedef與shared_ptr
- 3. shared_ptr原始指針參數
- 4. 單身人士,shared_ptr,原始指針或其他指針?
- 5. 當我們將一個指針指向NULL時會發生什麼?
- 6. shared_ptr :: reset只適用於原始指針?
- 7. C++原始指針和std :: shared_ptr的
- 8. 從原始指針到std :: shared_ptr的
- 9. 從原始指針創建shared_ptr
- 10. 當懸掛指針被刪除時會發生什麼?
- 11. 當我們使用錯誤的notify()時會發生什麼?
- 12. 指向另一個指針的指針 - 會發生什麼?
- 13. 當我們在一個零指針調用一個方法會發生什麼
- 14. 當其shared_ptr被銷燬時,weak_ptr會發生什麼?
- 15. 當我們使用updatepanel時會發生什麼?
- 16. 當我們任意使用==時會發生什麼?
- 17. 當我們使用document.getElementsByTagName(「body」)[0]時會發生什麼?
- 18. 查找指針會發生什麼?
- 19. 什麼時候應該在智能指針上使用原始指針?
- 20. 當模塊初始化發生異常時會發生什麼
- 21. (C++)堆上沒有指向它們的指針的對象會發生什麼?
- 22. 當檢測到死鎖時會發生什麼
- 23. 在MSP430上,當我解引用空指針時會發生什麼?
- 24. 當我們調用ServiceWorkerRegistration.pushManager.subscribe()時會發生什麼?
- 25. 當我們調用$(document).ready()時,會發生什麼?
- 26. 當我們調用requestLocationUpdates()時會發生什麼?
- 27. 當我們調用ArrayList.add()方法時會發生什麼?
- 28. 通過引用指針使用帶參數的函數時會發生什麼?
- 29. 當鑄造的指針有增量運算符時會發生什麼?
- 30. 當引用作用域結束時,引用指向指針對象(堆中的對象)時會發生什麼?
你可以發表一個簡短的例子,表現出這種行爲? – Borgleader 2014-12-02 22:21:54
難以閱讀,找出你的問題是什麼......發佈一些代碼。 – kebs 2014-12-02 22:22:39
tl; dr man。嘗試添加換行符plz – 2014-12-02 22:23:11