为什么这个指针没有分配给新对象?

时间:2012-04-14 16:39:19

标签: c++ pointers

我正在定义一个像这样的二叉搜索树类:

template <class T>
class BSTNode
{
  public:
    BSTNode(){
      right = left = 0;
    }

    BSTNode(const T& el, BSTNode * l = 0, BSTNode * r = 0)
    {
    val = el; left = l; right = r;
    }   

    T val;
    BSTNode * right;
    BSTNode * left;
};

template <class T>
class BST
{
  public:
    BST(){ root = 0;}           
    void Insert(const T& el);
  private:
    BSTNode<T> * root;
};

我实现Insert()函数,如下所示:

template <class T>
void BST<T>::Insert(const T& el)
{
  bool bEqual = false;
  BSTNode<T> * p = root;

  while(p)
  {
    if(el == p->val)
    {
      bEqual = true;
      return;
    }
    if(el < p->val)
    {
      // go left
      p = p->left;
    }
    if(el > p->val)
    {
      // go right
      p = p->right;
    }
  }

  if(!p)
  {
    std::cout << "creating new node " << el << "\n";
    p = new BSTNode<T>(el);
  }  
}

为什么root指针变量保持为0,而不是新对象的地址?

2 个答案:

答案 0 :(得分:2)

您的代码中永远不会root = ?;;另外,p = new BSTNode<T>(el);泄漏记忆。

我的猜测是你希望p成为指针的引用,所以你可以改变原始指针。

 BSTNode<T> *& p = root; // watch out, it won't solve anything

但是,在这种情况下,p不可重新分配。您可能想要检查分配给p的指针是否为空,只是将新值插入正确的位置(例如p->left = new BSTNode<T>(el);)并仅在给定指针不为空时重新分配p

我的意思是:

template <class T>
void BST<T>::Insert(const T& el)
{
  bool bEqual = false;
  BSTNode<T> * p = root;

  if (p == 0)
  {
     root = new BSTNode<T>(el);
     return;
  }

  while(true)
  {
    if(el == p->val)
    {
      bEqual = true;
      return;
    }
    if(el < p->val)
    {
      if (p->left == 0)
      {
        p->left = new BSTNode<T>(el);
        return;
      }
      p = p->left;
    }
    if(el > p->val)
    {
      if (p->right == 0)
      {
        p->right = new BSTNode<T>(el);
        return;
      }
      p = p->right;
    }
  }
} 

答案 1 :(得分:1)

因为在构造对象

声明

  p= root

将p初始化为空指针..

您创建一个新对象并将其地址传递给p而不是root ...

事情是p只是root的副本而不是对这个指针的引用..