二叉树的智能指针

时间:2017-10-18 07:19:00

标签: c++ c++11 pointers

如果我有一个二叉树,其中每个节点只包含指向子节点的指针,那么unique_ptr效果很好。如果我希望每个节点都有一个父指针,那么情况就不那么好了,因为一个节点可能有三个指针指向它:Binary Tree with parent pointer

在这种情况下我该怎么办?我可以使用shared_ptr作为一切,但我已经被告知它不是一个好设计,因为我可能会得到周期。如果我使用weak_ptr作为父指针,shared_ptr我是从weak_ptr创建的吗?

哪种类型的指针适合二叉树?

1 个答案:

答案 0 :(得分:7)

  

如果我有一个二叉树,每个节点只包含指针   子节点,然后unique_ptr效果很好。

右。

  

如果我希望每个节点都有父指针,那么情况就是如此   不太好,因为一个节点可能有三个指向它的指针

您应该区分拥有指针和观察指针之间的指针。

拥有原始 拥有指针是一个坏主意,也是错误和泄漏的来源;另一方面,拥有 raw 观察指针在许多情况下都可以正常(只要观察到的对象仍然是"直播")。

在您的情况下,您可能需要考虑一个设计,其中每个节点都包含unique_ptr个子节点,因为它们是拥有指针,并使用智能拥有指针,如{ {1}}在这种情况下效果很好。

另一方面,子节点可以使用非拥有指针(孩子们"不要拥有" 他们的父节点,子节点只是观察他们的父节点,而 raw 指针可以作为非拥有观察指针正常工作。

作为附注,当/如果您使用unique_ptr时,您必须注意周期,就好像您没有正确中断他们,然后你有泄漏(未发布的对象)。另一方面,父母通过拥有shared_ptr s指向孩子,而孩子们通过原始观察指针观察他们的父母,对我来说似乎是一个更简单的设计。