C++ 为什么我会遇到访问冲突运行时错误?

C++ 为什么我会遇到访问冲突运行时错误?,c++,C++,当我从main()调用BTree的insert(T)成员函数时就会出现问题,该函数调用BTree(T)构造函数。构造函数使用BTree成员BNode指针(根),并应将BNode对象的值设置为使用root->value=key传递给构造函数的参数(key是类型为T的构造函数参数)。我不明白为什么root->value=key导致内存访问冲突 template <typename T> class BNode { public: BNode(T key, BNode<

当我从
main()
调用
BTree
insert(T)
成员函数时就会出现问题,该函数调用
BTree(T)
构造函数。构造函数使用
BTree
成员
BNode
指针(根),并应将
BNode
对象的值设置为使用
root->value=key
传递给构造函数的参数(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);
}
模板
B类节点
{
公众:
BNode(T键,BNode*lptr,BNode*rptr);
T值;
b节点*左,*右;
};
样板
B类树
{
公众:
b树();
BTree(T&key,BTree*LT,BTree*RT);
BTree(T键);
~b树();
消除空洞(BNode*rt);
无效插入(T键);
私人:
BNode*根;
};
样板
BNode::BNode(T val,BNode*lptr,BNode*rptr)
{
值=val;
左=lptr;
右=rptr;
}
样板
BTree::BTree()
{
root=NULL;
}
样板
BTree::BTree(T&key,BTree*LT,BTree*RT)
{
根->值=键;
根->左=左->根;
root->right=RT->root;
}
样板
BTree::BTree(T键)
{
根->值=键;
}
样板
BTree::~BTree()
{
除去(根);
}
样板
void BTree::remove(BNode*rt)
{
如果(rt!=NULL)
{
移除(rt->左);
移除(rt->右侧);
删除rt;
}
}
样板
void BTree::insert(T key)//将后缀表达式带到树上
{
b树(键);
}
int main()
{
树木;
树。插入(5);
}

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

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

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

此代码的一个问题是,在构造

BTree<T> tree(key);
b树(键);
voidbtree::insert(T键)
中调用

template <typename T>
BTree<T>::BTree(T key) 
{
    root->value = key;
}
模板
BTree::BTree(T键)
{
根->值=键;
}
由于
root
从未初始化,因此您正在取消引用一个垃圾指针,该指针是未定义的行为


我还想指出,您的
insert
函数除了创建一个将被销毁的节点外,什么也不做。实际上,您需要将节点添加到列表中。您可以看到如何在

中实现二叉树调试是一个非常有用的工具,可以找到此类问题的答案。一步一步地完成代码,然后观察发生了什么。