根据算法,我的代码似乎应该可以正常工作,但我是 C++ 的新手,当我多次调用插入时,这些指针似乎正在覆盖自身。例如,如果我用值 1、3、5 调用 insert,则根将为 1(正如预期的那样),但 3 将被覆盖,并且根的右子节点的值为 5 而不是 3。
virtual bool insert(const Data& item) {
if(root == NULL){
BSTNode<Data> newNode (item);
root = &newNode;
isize++;
return true;
}
BSTNode<Data>* nextNode = root;
BSTNode<Data>* prevNode = NULL;
bool isLeft;
while(nextNode!=NULL) {
if (item < nextNode->data) {
prevNode = nextNode;
nextNode = nextNode->left;
//std::cout << prevNode->data;
isLeft = true;
}
else {
prevNode = nextNode;
nextNode = nextNode->right;
//std::cout << prevNode->data;
isLeft = false;
}
}
BSTNode<Data> createNode (item);
createNode.parent = prevNode;
if (isLeft) prevNode->left = &createNode;
else prevNode->right = &createNode;
isize++;
return true;
}
最佳答案
由于指向将要销毁的本地对象,您有一个无效指针:
BSTNode<Data> newNode (item);
root = &newNode;
对象 newNode
是方法 insert
中的本地对象,从该方法返回后(超出范围),指针 root
将指向到一个被摧毁的物体。
解决该问题的一个天真的可能性是通过 new
在堆中分配 newNode
:
root = new BSTNode<Data>(item);
但是你必须在某处删除
它,对于createNode
也是同样的问题。
正如许多人所推荐的,您应该使用诸如 unique_ptr
和 shared_ptr
之类的智能点。
关于C++ 指针或内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19243377/