繁体   English   中英

C ++指针或内存

[英]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);

但是您必须deletedelete ,并且createNode也会出现同样的问题。


正如许多人所建议的那样,您应该使用智能点,例如unique_ptrshared_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM