[英]Pointer to pointer going out of scope in a way that I don't want it to
我有一個用於在二分搜索樹中找到指定節點以及該節點先前節點的功能:
bool collection::removeFromTree(const char name[])
{
treeNode ** prev = nullptr;
for (treeNode ** curr = &root; *curr;)
{
int8_t result = strcmp(name, (*curr)->item->getName());
if (result == 0)
{
deleteNode(prev, curr);
return true;
}
else if (result < 0)
{
prev = curr;
curr = &((*curr)->left);
}
else if (result > 0)
{
prev = curr;
curr = &((*curr)->right);
}
}
return false;
}
我遇到的問題不在於此函數,而deleteNode()
我的deleteNode()
函數。 我無法分配我的上一個節點指向當前節點(或我打算刪除的節點)之后的節點。 這是我的deleteNode()
函數的重要部分:
void collection::deleteNode(treeNode **& prevNode, treeNode **& goneNode)
{
//irrelevant code
//if it has right child
if (!(*goneNode)->left)
{
treeNode * temp = (*goneNode)->right;
(*goneNode)->right = nullptr;
delete *goneNode;
(*prevNode)->right = temp;
*goneNode = nullptr;
}
//irrelevant code
}
當然,問題在於此函數運行后(*prevNode)->right
變為null
。 指向該指針的指針超出范圍,並且數據丟失。 在goedNode右邊的任何節點都超出范圍。 有什么好的方法可以解決此問題?
我也嘗試過:
void collection::deleteNode(treeNode **& prevNode, treeNode **& goneNode)
{
//irrelevant code
//if it has right child
if (!(*goneNode)->left)
{
(*prevNode)->right = (*goneNode)->right;
(*goneNode)->right = nullptr;
delete *goneNode;
*goneNode = nullptr;
}
//irrelevant code
}
當我這樣做時,在delete *goneNode;
之后, (*prevNode)->right
變為null
delete *goneNode;
(在函數執行完成之前)。
這里使用兩星指針的好處是避免使用current
指針和previous
指針。 具有指向節點的指針的指針,我們可以編輯將節點綁定到樹中的鏈接。 上一個節點的其余部分無關緊要; 我們只關心指向我稱之為bad_node
(要刪除的bad_node
的指針。
(*prevNode)->right = (*goneNode)->right; //50% chance that (*prevNode)->right was (*goneNode)
無論是bad_node
是右側prevNode
,我們抹去的位置bad_node
,或者它的左側和我們毀傷樹。 我相信在您的情況下,第一個正在發生。 一旦執行該行, *goneNode
值將是錯誤的,因此最終會泄漏goneNode
並刪除其子級。
扯開自己 :
else if (!(*goneNode)->left) //one child on right
{
treeNode* temp = *goneNode; //store address of bad_node
*goneNode = (*goneNode)->right; //replace bad_node with child
temp->right = nullptr; //bad_node now has no children
delete temp; //delete bad_node
}
要記住的重要一點是, *goneNode
是將指針bad_node
樹 。 分配給*goneNode
更改樹的結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.