2017-10-18 125 views
3

如果我有一個二叉樹,其中每個節點只包含指向子節點的指針,那麼unique_ptr工作得很好。如果我希望每個節點都有一個父指針,那麼情況並不好,因爲一個節點可能有三個指針指向它:Binary Tree with parent pointer二叉樹智能指針

在這種情況下我能做些什麼?我可以使用shared_ptr來處理所有事情,但我被告知這不是一個好的設計,因爲我可能會得到週期。如果我使用weak_ptr作爲父指針,那麼shared_ptr是否會創建這個weak_ptr

我開始認爲普通的內置指針可能更適合這個問題。任何意見是極大的讚賞。

+11

一對'std :: unique_ptr'和一個**非擁有**原始指針指向父對象沒有任何問題。 – StoryTeller

+7

大多數情況下,您不應該看到智能指針是簡單的自我刪除指針,而是作爲所有權原語。一個「資源」可以只有一個所有者(使用'std :: unique_ptr')還是多個併發所有者(使用'std :: shared_ptr')? –

+0

也許我一個人在這裏,但在btree實現中使用智能指針的想法並不是最好的。我看到在你有控制權的具體類中使用原始指針沒有問題。另外,「作爲所有者」的概念並不容易(因爲有更多的一個「直覺」觀點)與一棵樹相連。如果你想稍後對它進行一些圖表操作,它可能會變得一團糟。 –

回答

4

如果我有一個二叉樹,每個節點只包含指向 子節點,然後unique_ptr作品非常好。

沒錯。

如果我想每個節點有一個父指針,那麼情況就 不是很好,因爲一個節點可以有三個指向它的指針擁有之間

你應該區分指針指針和觀察指針。

擁有原始擁有指針是一個壞主意,是錯誤和泄漏的根源;另一方面,有原始觀察指針可以在很多情況下罰款(只要觀察對象仍然是「活」)。

在你的情況,你可能要考慮一種設計,其中每個節點都包含unique_ptr s到子節點,因爲這些都是擁有指針,在這種情況下使用智能指針所屬像unique_ptr效果很好。

。另一方面,孩子節點可以參考他們的父母使用非所屬指針(孩子「沒有自己」其父,子節點只是觀察他們的父母),和一個原始指針工作正常,因爲非擁有觀察指針。

作爲一個方面說明,當/如果你使用shared_ptr你必須要注意週期,因爲如果你沒有正確休息他們,那麼你有泄漏(未發行對象)。另一方面,父母通過擁有unique_ptr s和孩子通過原始觀察指針觀察其父母,這對我來說似乎是一個更簡單的設計。

+0

謝謝。我認爲內置指針總是不好(除了函數指針)。但想想擁有和觀察指針會更有意義。應該使用弱指針和內置(愚蠢)指針來觀察。擁有獨特和共享的指針。非常感謝,這對我來說更加清晰。 – RonnyZed

+0

@RonnyZed不客氣。我很高興我有一些幫助。 –