当我从调用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);
}
答案 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