我在用C实现的二进制树++的过程。传统上,我有一个指向左边的指针和指向正确的,但手动内存管理通常在泪水结束。这我导致了我的问题...

是数据结构使用的shared_ptr的适当位置?

有帮助吗?

解决方案

我认为这取决于在那里你会使用它们。我假设你在想什么做的是这样的:

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;
}

如果有人问为什么数据不是一个shared_ptr,答案很简单 - 如果数据的副本都不错的的客户的图书馆,他们在传递数据项,和树节点进行复印。如果的客户的决定副本是一个坏主意,那么的客户的代码可以在一个shared_ptr,该树节点可以安全地复制过去。

其他提示

由于左和右不是共享的升压:: shared_ptr的<>可能是不正确的智能指针。

这是尝试的std :: auto_ptr的<>

的好地方

是,绝对

但要小心,如果你有一个圆形的数据结构。如果你有两个对象,都与共享PTR给对方,那么他们将永远不会被不手动清除共享的PTR释放。弱PTR在这种情况下使用。这当然是不与二叉树担心。

编写存储器管理手动不在那些喜庆场合,其中每个对象具有一个单一的所有者,所以难以因此可以删除它所拥有它的析构。

鉴于树通过定义由各自具有一个父,因此,对于他们的单一所有者一个明显的候选节点的,这仅仅是这种快乐的场合。恭喜!

我觉得这是非常值得*发展你的情况下,这样的解决方案,同时还尝试shared_ptr方法,遮盖力完全落后了相同的接口的不同,让你在两者之间和交换机与一些现实的比较,在性能上的差异实验。这是唯一肯定的方式知道shared_ptr是否适合您的应用程序。

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

从不使用的shared_ptr用于在数据结构的节点。它可以导致节点的破坏被暂停或延迟,如果在任何点处所有权共享。这可能会导致析构函数在错误的顺序被调用。 这是数据结构节点的构造函数包含夫妇与其他节点和析构函数包含的代码去耦合来自其他节点的任何代码,一个很好的做法。析构函数调用在错误的序列可以打破这种设计。

有是一点额外的开销一个shared_ptr,特别是在空间的要求,但如果你的元素被单独分配,然后shared_ptr的将是完美的。

你甚至需要指点?看来你可以使用boost::optional<BinaryTreeNode<T> > left, right

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top