2014-12-02 46 views
0

我正在研究一個遊戲引擎,它利用了由各種組件組成的actor。這些演員擁有他們的組件,而組件也擁有他們的父演員。我有一個名爲Destroy的成員函數,它打破了循環引用鏈,因此可以清理所有內容。我試圖基本上把所有的東西當做組件來做。例如,即使相機是連接到某些演員的組件。這意味着諸如渲染器之類的東西需要訪問相機組件以便提取它們的視圖和proj矩陣,所以我想在當前活動攝像機的渲染器和它們渲染的窗口中保留一個列表。我不能讓它共享指針,因爲這樣可以防止演員在應該被破壞時被破壞。我不想使用弱指針,因爲它需要鎖定每一幀,以獲得視圖和投影矩陣。所以我打算嘗試使用原始指針,並在使用它之前檢查它是否爲nullptr。不幸的是,這是行不通的。當相機組件的shared_ptr超出範圍時,原始指針保持有效,但只是指向垃圾?我的印象是shared_ptr應該清理它。這是否會成爲我需要定製刪除程序的情況?一個刪除並將值設置爲nullptr的?當他們的shared_ptr死時使用原始指針會發生什麼

+0

你可以發表一個簡短的例子,表現出這種行爲? – Borgleader 2014-12-02 22:21:54

+0

難以閱讀,找出你的問題是什麼......發佈一些代碼。 – kebs 2014-12-02 22:22:39

+1

tl; dr man。嘗試添加換行符plz – 2014-12-02 22:23:11

回答

3

當相機組件的shared_ptr超出範圍時,原始指針保持有效,但只是指向垃圾?

然後它不是「有效」;它的晃來晃去

我的印象是shared_ptr應該清理它。這是否會成爲我需要定製刪除器的情況?一個刪除並將值設置爲nullptr的?

是你期待一個std::shared_ptr指向一個對象obj奇蹟般地與價值&objnullptr將所有原始指針在整個程序?那是不可能的!

這是你的責任NULL指出,否則將懸停。通過與智能指針同時使用原始指針,您向自己保證,您知道自己在做什麼,並保持原始指針的安全,但之後未能如願。

如果您希望「原始指針」不增加引用計數,但指向另外一個智能管理的對象,則使用std::weak_ptr s。

如果因爲任何原因你不能使用弱指針,那麼,是的,你將不得不將自己的裸指針NULL。定製刪除器將是一個很好的解決方法。

+0

免責聲明:我只讀了你的問題的最後六行。 – 2014-12-02 22:26:35

+0

只讀最後六行,你給我我正在尋找的答案。我要麼必須將所有內容切換爲raw指針,要麼處理使用weak_ptr的「manager」類型對象的開銷。 – user3355098 2014-12-02 22:33:51

+0

@ user3355098:是的。我其實很喜歡你使用自定義刪除器的想法,只要你不會以這種方式陷入混亂。 – 2014-12-02 22:36:19

相關問題