为什么我收到访问冲突运行时错误?

时间:2016-02-24 16:31:28

标签: c++

当我从调用insert(T)构造函数的BTree main()调用BTree(T)成员函数时,会出现问题。构造函数使用BTree成员BNode指针(root),并应将BNode对象的值设置为使用root->value = key(密钥)传递给构造函数的参数是T)类型的构造函数参数。我不明白为什么root->value = key;导致内存访问冲突。

template <typename T>
class BNode
{
  public:
      BNode(T key, BNode<T> *lptr, BNode<T> *rptr);
      T value;
      BNode<T> *left, *right;
};

template <typename T>
class BTree
{
  public:
      BTree();
      BTree(T& key, BTree<T>* LT, BTree<T>* RT);
      BTree(T key);
      ~BTree();
      void remove(BNode<T> *rt);
      void insert(T key);

  private:
      BNode<T> *root;

};


template<typename T>
BNode<T>::BNode(T val, BNode<T> *lptr, BNode<T> *rptr)
{
    value = val;
    left = lptr;
    right = rptr;
}


template<typename T>
BTree<T>::BTree()
{
    root = NULL;
}

template<typename T>
BTree<T>::BTree(T& key, BTree<T> *LT, BTree<T> *RT)
{
    root->value = key;
    root->left = LT->root;
    root->right = RT->root;
}

template <typename T>
BTree<T>::BTree(T key) 
{
    root->value = key;
}

template<typename T>
BTree<T>::~BTree()
{
    remove(root);
}

template<typename T>
void BTree<T>::remove(BNode<T> *rt)
{
    if (rt != NULL)
    {
        remove(rt->left);
        remove(rt->right);
        delete rt;
    }
}

template<typename T>
void BTree<T>::insert(T key) //takes postfix expression onto tree
{
        BTree<T> tree(key);

}

int main()
{
    BTree<int> tree;
    tree.insert(5);
}

2 个答案:

答案 0 :(得分:3)

您的root指针未初始化,并且您在构造函数中执行以下操作时尝试取消引用它:

root->value = key;
root->left = LT->root;
root->right = RT->root;

取消引用未初始化的指针会导致分段错误。

答案 1 :(得分:3)

此代码的一个问题是构建

BTree<T> tree(key);
void BTree<T>::insert(T key)调用

中的

template <typename T>
BTree<T>::BTree(T key) 
{
    root->value = key;
}

由于root从未初始化,因此您将取消引用未定义行为的垃圾指针。

我还想指出,你的insert函数除了创建一个将被销毁的节点之外什么都不做。您实际上需要将节点添加到列表中。您可以在Binary Search Tree C++ Implementation

查看如何实现二叉树