二叉树智能指针

问题描述:

如果我有一个二叉树,其中每个节点只包含指向子节点的指针,那么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实现中使用智能指针的想法并不是最好的。我看到在你有控制权的具体类中使用原始指针没有问题。另外,“作为所有者”的概念并不容易(因为有更多的一个“直觉”观点)与一棵树相连。如果你想稍后对它进行一些图表操作,它可能会变得一团糟。 –

如果我有一个二叉树,每个节点只包含指向 子节点,然后unique_ptr作品非常好。

没错。

如果我想每个节点有一个父指针,那么情况就 不是很好,因为一个节点可以有三个指向它的指针拥有之间

你应该区分指针指针和观察指针。

拥有原始拥有指针是一个坏主意,是错误和泄漏的根源;另一方面,有原始观察指针可以在很多情况下罚款(只要观察对象仍然是“活”)。

在你的情况,你可能要考虑一种设计,其中每个节点都包含unique_ptr s到子节点,因为这些都是拥有指针,在这种情况下使用智能指针所属像unique_ptr效果很好。

。另一方面,孩子节点可以参考他们的父母使用非所属指针(孩子“没有自己”其父,子节点只是观察他们的父母),和一个原始指针工作正常,因为非拥有观察指针。

作为一个方面说明,当/如果你使用shared_ptr你必须要注意周期,因为如果你没有正确休息他们,那么你有泄漏(未发行对象)。另一方面,父母通过拥有unique_ptr s和孩子通过原始观察指针观察其父母,这对我来说似乎是一个更简单的设计。

+0

谢谢。我认为内置指针总是不好(除了函数指针)。但想想拥有和观察指针会更有意义。应该使用弱指针和内置(愚蠢)指针来观察。拥有独特和共享的指针。非常感谢,这对我来说更加清晰。 – RonnyZed

+0

@RonnyZed不客气。我很高兴我有一些帮助。 –