我在C++中編寫了一個相對較大的項目,並且存在對象刪除問題。該項目,準確地說是一個roguelike遊戲。C++安全對象刪除
我有一個類Npc
這是遊戲中的每個怪物。它們被創建並存儲在一個單獨的類Storage<Npc>
中,負責其管理(加載,保存,創建,刪除等)。每當怪物死亡時,相應的對象npc
必須完全刪除並銷燬。刪除對象本身並不是一個問題,我只需要調用Storage<NPC>
中的一個方法。問題是代碼中包含了很多指向這個已經死亡的npc
的指針,現在這些指針是無效的,並且試圖使用它們會導致很多問題。例如:
- 在他去世前可能會有一個他打算執行的操作。
- 他在其上放置唱片的瓷磚上有一個指向他的指針。
- 他可能參與過一些連續的活動,比如擒拿某人。
代碼中有很多這樣的指針,所以幾乎不可能簡單地跟蹤它們。我需要的是確定一個npc
已經死亡的方法,並且該地址上沒有存儲實際的對象,所以仍然有這個指針的代碼部分可以充分地對他的死亡作出反應。
我自己也想出了一些想法,但至今沒有人似乎真的對我好:
- 我可以問
Storage<NPC>
類,如果有這種地址的對象。潛在的問題是,刪除對象後,可能會在同一地址分配另一個對象,這會導致錯誤。 - 我可以通知所有可能使用無效指針的位置。這是一個壞主意,因爲這些地點的數量會隨着時間的推移而增加,這樣做是一種痛苦。
- 我可以實現一些版本的智能指針,但我不確定要使用哪一個。
TL;博士版本:我需要一個解決方案,如果一個指針指向會告訴我一個對象,或者它指向的內存空閒塊,或者一些其他的對象,原來的對象刪除後分配。
每當內存被釋放/變得無效時,如何將它設置爲'nullptr'? :P – SingerOfTheFall
您已經用答案標記了您的問題:使用智能指針。我建議使用std :: shared_ptr – stefan
@SingerOfTheFall,我猜你想說的是,每當我做'刪除pnpc;'我應該'pnpc = 0;'。但是,如果有另一個指針等於'pnpc'被存儲在程序中的其他地方,它不會被設置爲0,所以我猜這是行不通的。 – Saage