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

クラスツリー、弱いptr

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

このようなノードに弱いポインターを使用しないでください。ウィーク ポインターとは、そのオブジェクトへの他のウィーク ポインターが存在しない場合、そのオブジェクトに使用できるウィーク ポインターがまだある場合でも、オブジェクトが削除される可能性があることを意味します。

したがって、あなたの場合、ルートへの弱いポインターが1つあり、共有ポインターはありません。この状況では、ルートは削除されます。これは、ルートを存続させている共有ポインタがなく、すべてのツリーがなくなるためです。

一般的なルールは、共有ポインターを所有関係に使用する必要があるということです。ツリーは間違いなくそれ自体のルートを所有しています。一方、弱いポ​​インターは、直接または間接の親へのバックポインターに使用して、円から抜け出す必要があります。したがって、ルートを指すノードがある場合、これは弱いポインターを使用する場所になります。

確認する最善の方法は、最初に共有ポインターの使用を試み、依存関係で円を構築しないように注意することです。円を壊す必要がある場合にのみ、所有権/バックポインターの違いに基づいて、共有ポインターを弱いポインターに変更します。

于 2012-06-25T11:07:50.327 に答える