[英]C++ pointers or memory
给定算法,我的代码似乎应该可以工作,但是我对C ++还是陌生的,当我多次调用insert时,这些指针似乎会覆盖自身。 例如,如果我用值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);
但是您必须delete
其delete
,并且createNode
也会出现同样的问题。
正如许多人所建议的那样,您应该使用智能点,例如unique_ptr
和shared_ptr
。
假设root
是成员变量,则需要在堆而不是堆栈上分配它:
if(root == NULL){
root = new BSTNode<Data>(item);
isize++;
return true;
}
否则,一旦节点超出if
主体的闭合大括号, if
该节点将被销毁。 同样的道理
if (isLeft) prevNode->left = new BSTNode<Data>(item);
else prevNode->right = new BSTNode<Data>(item);
我还没有检查您的实际插入逻辑。 您应该发布完整的代码,这里没有太多可以检查的代码。 它是二叉树吗?
编辑:根据MM的回答,如果您在堆上创建节点,请不要忘记删除节点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.