树与boost shared_ptr

时间:2012-06-25 12:03:44

标签: c++ boost shared-ptr

我创建了这个简单的程序来学习shared_ptr

using namespace std;
 #define Yes 1
 #define No 0

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

 };

方法

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

}

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

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

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

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

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

  };

Tree::Tree()
{
root.reset();
}

 Tree::~Tree()
{
cout << "deleting tree" << endl;
}

树查找父级

void Tree::findParent(int n, int& found, boost::shared_ptr<Node> &parent)
{
   boost::shared_ptr<Node> q;
  found = No;

 cout << "looking parent of" << n << endl;
 if(parent.use_count() == 0)
 {
  cout << "not found" << endl;
  return;
  }

q=parent;

 while (!q.use_count())
{
  if( q->nVal == n)
  {
      cout << "found" << endl;
      found = Yes;
      return;

  }

  if (q->rigth->nVal)
  {
      cout << "looking to the rigth" << endl;
      parent = q;
      q = q->left;
  }
  else
  {
      cout << "looking to the left" << endl;
      parent = q;
      q = q->rigth;
  }
 }
}

树添加

void Tree::add(int n)
 {
 int found;

boost::shared_ptr<Node> parent;
findParent(n, found,parent);
if(found == Yes)
{
    cout << "no such node exist" << endl;
}

else
{

    boost::shared_ptr<Node> t(new Node(n));  
    t->rigth.reset();
    t->left.reset();

    if (parent.get()== 0)
    {
        parent = t;
    }
    else
    {
        parent->nVal > n ? parent->left = t : parent->rigth = t;
    }
}
}

主:

int THREADS_HOW_MANY = 0;

int main()
{
Tree bt;
bt.add(10);
bt.add(4);
bt.add(12);
bt.add(2);
bt.add(8);
bt.add(15);
bt.add(15);



return 0;
}

现在q是,为什么不起作用,为什么要给出这个输出:

  empty constructor only the root is reset
  looking parent of10
  not found
  creating node with value10
  entering destructor10
  looking parent of4
  not found
  creating node with value4
  entering destructor4
  looking parent of12
  not found
  creating node with value12
  entering destructor12
 looking parent of2
 not found
  creating node with value2
 entering destructor2

修复它现在是差异似乎只是创建和删除节点而不是添加到树中为什么??

1 个答案:

答案 0 :(得分:0)

这是你的代码:

// from Tree::add
boost::shared_ptr t(new Node(n));
boost::shared_ptr parent(new Node(n));
findParent(n, found,parent);

// from tree::findParent
boost::shared_ptr q(new Node(n));

因此,程序会根据请求为每个值创建3次节点。 shared_ptr确保每个节点都被正确销毁,因此Node析构函数也会被调用3次。