我有一個小的層次結構的類,我試圖找出維護所有權的簡單方法。由於這些對象駐留在堆上,並且由於我討厭原始指針,我想我會使用boost共享指針和弱指針。 (我可以選擇,但這是我習慣的。)共享指針可以幫助所有權,因爲當共享指針的所有者這麼說的時候,弱指針不會阻止對象被刪除。對象添加和從列表中刪除自己
層次結構:
class Actor;
class Body : public virtual Actor;
class Owned : public virtual Actor;
class Combatant : public Body, public Owned;
這裏也有一些其他類那裏。我可以使用虛擬繼承來處理鑽石繼承,所以這沒什麼大不了的。另外,我將爲它們中的每一個鍵入一些shared_ptrs和weak_ptrs。
我的想法是讓Actor維護Actor共享指針(ActorPTR)的靜態列表,並讓子類保持弱指針的靜態列表(BodyWPTR等)。這樣就有一個確定的共享指針集合,所以應該管理某種所有權(我會盡量不要在其他任何地方永久存儲共享指針)。擁有這些列表非常方便,因爲我可以快速地說,「讓我所有的戰鬥員都在附近」或「移動所有的身體」。
我想將對象插入到正確的列表中:一個Body將自己的弱指針插入到主體弱指針列表中,並且它會將一個Actor共享指針插入到該列表中,可能在構造函數。但(顯然)在構造函數中使用「this」指針(或它的shared_from_this()等價物)是很糟糕的。我能想到的唯一方法就是通過一大堆工廠方法。我還認爲,層次結構中的多個類繼承自enable_shared_from_this是很糟糕的。
如何讓對象在其構造函數中自動插入共享或弱指針到列表中?這是一個壞主意嗎?
(另外在「代碼」上面,我可能搞砸虛擬繼承語法但是這不是我關心的,現在,所以不要擔心。)
謝謝!
沒有談到清理策略,你不能說內存管理策略。事實上,Actor的靜態列表將保持所有演員永遠活着(類似於內存泄漏)。一旦你公開了處理清理的策略,那麼我們可以適當地回答(請回復我的意見,然後通知我)。 –
當然。Actor可能會有某種類型的destroy()方法將從列表中刪除。這樣,演員可以在需要時自行清理。如果它是唯一的永久共享指針,它應該被刪除,並且當遍歷弱指針列表時,我可以刪除那些過期的。 – whiterook6
這很奇怪,但爲什麼不。爲了提高效率,Actor應該將一個迭代器放入列表中(它已經被插入),這樣destroy就是O(1)。你仍然有可能忘記調用'destroy()'並導致內存泄漏。 –