二叉树的智能指针

Ron*_*Zed 6 c++ pointers c++11

如果我有一个二叉树,其中每个节点只包含指向子节点的指针,那么unique_ptr效果非常好.如果我希望每个节点都有一个父指针,那么情况就不那么好了,因为一个节点可能有三个指向它的指针:带有父指针的二进制树

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

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

Mr.*_*C64 7

如果我有一个二叉树,其中每个节点只包含指向子节点的指针,那么unique_ptr效果非常好.

对.

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

你应该区分拥有指针和观察指针之间的指针.

拥有原始 拥有指针是一个坏主意和错误和泄漏的来源; 另一方面,在许多情况下,具有原始 观察指针可以很好(只要观察到的对象仍然是"活的").

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

另一方面,子节点可以使用非拥有指针引用它们的父节点(子节点"不拥有"它们的父节点,子节点只观察它们的父节点),并且原始指针可以正常工作作为非拥有观察指针.

作为旁注,当你/如果你使用shared_ptr你必须注意周期,就好像你没有正确地打破它们,那么你有泄漏(未发布的对象).另一方面,通过拥有unique_ptrs 指向孩子的父母,以及孩子通过原始观察指针观察他们的父母,对我来说似乎是一个更简单的设计.

  • @Alexander观察指针是一个概念.一个不拥有它指向的数据的指针.为此,您可以使用原始指针(例如`Node*parent`),因此可以使用"原始观察指针"命名法,或者您可以创建自己的类,模仿原始指针,但通过其类型只是一个观察者指针(例如, `Observing_ptr <Node> parent`)[续] (2认同)