代码之家  ›  专栏  ›  技术社区  ›  Gabriel Isenberg

数据结构是否是共享ptr的合适位置?

  •  5
  • Gabriel Isenberg  · 技术社区  · 16 年前

    我正在用C++实现二进制树的过程。传统上,我会有一个指向左边的指针和一个指向右边的指针,但手动内存管理通常以眼泪结束。这就引出了我的问题。。。

    数据结构是否是使用共享ptr的合适位置?

    7 回复  |  直到 16 年前
        1
  •  8
  •   Harper Shelby damiankolasa    16 年前

    我想这取决于你在哪里使用它们。我假设你想做的事情是这样的:

    template <class T>
    class BinaryTreeNode 
    {
        //public interface ignored for this example
        private:
            shared_ptr<BinaryTreeNode<T> > left;
            shared_ptr<BinaryTreeNode<T> > right;
            T data;
    }
    

    这是完全有道理的 如果 您希望您的数据结构能够处理动态创建的节点。然而,由于这不是正常的设计,我认为这是不合适的。

    我的答案是不,这不是一个使用shared_ptr的合适地方,因为shared_ptr的使用意味着对象实际上是共享的——然而,二叉树中的节点是共享的 曾经分享过。然而,正如马丁·约克所指出的,为什么要重新发明轮子呢?已经有了一种智能指针类型,它可以实现我们正在尝试的功能——auto_ptr。那么就这样说吧:

    template <class T>
    class BinaryTreeNode 
    {
        //public interface ignored for this example
        private:
            auto_ptr<BinaryTreeNode<T> > left;
            auto_ptr<BinaryTreeNode<T> > right;
            T data;
    }
    

    如果有人问为什么数据不是共享的,答案很简单——如果数据的拷贝对用户有好处的话 客户 对于库,它们传入数据项,树节点创建一个副本。如果 客户 认为复制是个坏主意,然后 代码可以传入共享的_ptr,树节点可以安全地复制它。

        2
  •  3
  •   Loki Astari    16 年前

    因为左侧和右侧不是共享的boost::shared_ptr<&燃气轮机;可能不是正确的智能指针。

    这将是一个尝试std::auto_ptr<&燃气轮机;

        3
  •  2
  •   David Norman    16 年前

    但是,如果您有一个循环数据结构,请小心。如果您有两个对象,它们都彼此具有共享ptr,那么如果不手动清除共享ptr,它们将永远不会被释放。在这种情况下,可以使用弱ptr。当然,这不是二叉树的问题。

        4
  •  2
  •   Daniel Earwicker    16 年前

    根据定义,一棵树由节点组成,每个节点都有一个父节点,因此显然是它们的单一所有者的候选节点,因此这是一个非常愉快的时刻。祝贺

    我认为,在你的情况下,开发这样一个解决方案,并尝试 shared_ptr 共享ptr

    (*对我们来说,如果你告诉我们进展如何。)

        5
  •  1
  •   John Morrison    15 年前

    切勿对数据结构的节点使用共享ptr。如果在任何一点上共享了所有权,则会导致暂停或延迟节点的销毁。这可能导致以错误的顺序调用析构函数。 在数据结构中,节点的构造函数包含与其他节点耦合的任何代码,析构函数包含与其他节点解耦合的代码是一种很好的做法。按错误顺序调用的析构函数可能会破坏此设计。

        6
  •  0
  •   Mark Ransom    16 年前

    共享的ptr有一点额外的开销,特别是在空间需求方面,但是如果您的元素是单独分配的,那么共享的ptr将是完美的。

        7
  •  0
  •   MSalters    16 年前

    你需要指针吗?看来你可以用 boost::optional<BinaryTreeNode<T> > left, right .

    推荐文章