【问题标题】:Smart Pointers for Binary Tree [closed]二叉树的智能指针
【发布时间】:2017-10-18 07:19:00
【问题描述】:

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

在这种情况下我能做什么?我可以使用shared_ptr 来处理所有事情,但有人告诉我这不是一个好的设计,因为我可能会遇到周期问题。如果我要使用weak_ptr 作为父指针,我应该从哪个shared_ptr 创建这个weak_ptr

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

【问题讨论】:

  • 一对std::unique_ptr 和一个非拥有指向父级的原始指针没有任何问题。
  • 大多数时候,您不应该将智能指针视为简单的自删除指针,而是将其视为所有权原语。 “资源”可以只有一个所有者(std::unique_ptr)或多个同时所有者(std::shared_ptr)吗?
  • 也许我一个人在这里,但在 btree 实现中使用智能指针的整个想法并不是最好的。我认为在您可以控制的具体类中使用原始指针没有问题。此外,“成为所有者”的概念并不容易(恕我直言,不止一个“直觉”观点)与一棵树相关联。如果你以后想在它上面实现一些图形操作,它可能会变得一团糟。

标签: c++ c++11 pointers


【解决方案1】:

如果我有一棵二叉树,其中每个节点只包含指向 子节点,然后unique_ptr 工作得很好。

没错。

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

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

拥有原始 拥有指针是一个坏主意,也是错误和泄漏的根源;另一方面,在许多情况下,拥有 raw observing 指针可能没问题(只要观察到的对象仍然是“活动的”)。

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

另一方面,子节点可以使用非拥有指针来引用它们的父节点(子节点“不拥有”它们的父节点,子节点节点只是 observe 它们的父节点),而 raw 指针可以作为非拥有 observing 指针正常工作。

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

【讨论】:

  • 谢谢。我认为内置指针总是不好的(函数指针除外)。但是考虑拥有和观察指针更有意义。应该使用弱指针和内置(哑)指针进行观察。拥有的唯一和共享指针。非常感谢,这对我来说更清楚了。
  • @RonnyZed 不客气。很高兴我能帮上忙。
  • 什么是“原始观察指针”?只是带有*& 的普通旧常规指针?
  • @Alexander 观察指针是一个概念。不拥有它指向的数据的指针。为此,您可以使用原始指针(例如Node* parent)因此使用“原始观察指针”命名法,或者您可以创建自己的类来模仿原始指针,但通过它的类型来明确它只是一个观察者指针(例如@987654329 @) [续]
  • ... [继续] 如果您的应用程序使用智能指针作为所有权并使用原始指针来观察指针,那么这没关系,因为很明显原始指针是观察者并且没有所有权语义。但是,如果您的应用程序使用了一些设计不佳的第三方库,该库使用原始指针作为所有权语义,那么您可能需要创建提到的 Observer_ptr 类,以阐明哪些指针只是观察者。
猜你喜欢
  • 2018-01-20
  • 2012-08-21
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 2020-03-18
相关资源
最近更新 更多