我正在用C++实现二叉树。传统上,我会有一个指针指向左边和一个指针指向右边,但手动内存管理通常会导致问题。这让我想到了我的问题...
数据结构是否适合使用shared_ptr?
我正在用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;
}
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,这样树节点就可以安全地复制。
因为左右不共享,所以 boost::shared_ptr<> 可能不是正确的智能指针。
在这种情况下,尝试使用 std::auto_ptr<> 是一个好选择。
是的,绝对可以。
但是如果您有一个循环数据结构,请小心。如果您有两个对象,它们都具有彼此共享的指针,则它们将永远不会被释放,除非手动清除共享指针。在这种情况下,可以使用弱指针。当然,在二叉树中不必担心这个问题。
在数据结构的节点中,永远不要使用shared_ptr。如果在任何时候共享了所有权,则可能会导致节点的销毁被暂停或延迟。这可能会导致析构函数按错误的顺序调用。 在数据结构中,一个好的实践是将节点的构造函数包含与其他节点耦合的任何代码,并将析构函数包含解除与其他节点耦合的代码。以错误的顺序调用析构函数可能会破坏此设计。
使用shared_ptr会增加一些额外的开销,尤其是空间需求方面,但如果您的元素是单独分配的,则shared_ptr将是完美的选择。
boost::optional<BinaryTreeNode<T>> left,right
。