0

这是正确的方式,boost::shared_ptr用于节点左右和boost::weak_ptr根。我知道共享是一种矫枉过正。我以后需要这个。

类节点,2个儿子共享ptr

class Node
{
public:
boost::shared_ptr<Node> left;
boost::shared_ptr<Node> rigth;
int nVal;
Node();
Node(int);
~Node();
Node getVal(void);
void setVal(int);

};

Node::Node()
{
cout << "creating node empty" << endl;
nVal = 0;
left.reset();
rigth.reset();

}

Node::~Node()
{
cout << "entering destructor" << endl;
 }

Node::Node(int n)
{
cout << "creating node with value" << endl;
nVal = n;
left.reset();
rigth.reset();
}

Node Node::getVal(void)
{
cout << "returning value" << endl;
return this;
}

void Node::setVal(int n)
{
cout << "setting value" << endl;
nVal = n;
}

类树,弱指针

class Tree 
{
public:
boost::weak_ptr<Node> root;
Tree();
~Tree();
void findParent(int n, int &found, Node &parent);
void add(int n);
void post(boost::weak_ptr<Node> q);
void del(int n);

};

Tree::Tree()
{
root = NULL;
}
4

1 回答 1

0

您不应该像这样对节点使用弱指针。弱指针意味着即使该对象仍有可用的弱指针,如果不存在指向该对象的其他弱指针,该对象也可能被删除。

因此,在您的情况下,您有一个指向根的弱指针,而没有共享指针。在这种情况下,根将被删除,因为没有共享指针使其保持活动状态,并且所有树都将消失。

一般规则是,应将共享指针用于所有权关系。树绝对拥有自己的根。另一方面,弱指针应该用于指向直接或间接父母的反向指针,以打破循环。所以如果你有节点指向根,这将是一个使用弱指针的地方。

确保最好的方法是首先尝试使用共享指针,并注意不要在依赖项中建立任何圈子。仅当您必须打破循环时,才根据所有权/反向指针差异将共享指针更改为弱指针。

于 2012-06-25T11:07:50.327 回答