C++ 指针或内存

标签 c++ pointers memory

根据算法,我的代码似乎应该可以正常工作,但我是 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_ptrshared_ptr 之类的智能点。

关于C++ 指针或内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19243377/

相关文章:

javascript - 使用 $firebaseObject 有什么缺点?

c++ - 格式化返回指向包含类的指针的函数?

c++ - C/C++ 与 Python 之间交换值的应用程序设计

c++ - 在 C/C++ 中求解非线性反抛物线 PDE 的包

c++ - 如何将 QT 国际化集成到 CMake?

c - 为什么我的二维数组有如此奇怪的行为?

c - 将数据写入二进制文件,然后读回

c - C多维数组中的指针地址

linux - Linux 是否支持进程的内存隔离?

c++ - 如何获取有关域 .NET C++ 的信息