簡體   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