我必须为任务分配一个二叉搜索树,并且一切都很好,直到删除我的树为止。就我而言,这可能是一个非常简单的错误,但我不确定如何解决。每次我在运行程序时(包括删除树的代码),都会收到“抛出异常:读取访问冲突。节点为0xDDDDDDDD。”。
这是我的树的代码:
Tree::Tree()
{
head = NULL;
}
Tree::~Tree()
{
deleteNodes(head);
}
string Tree::checkBalance()
{
int lh;
int rh;
lh = height(head->leftBranch);
rh = height(head->rightBranch);
if (abs(lh - rh) <= 1)
return "KEEP";
else
return "REMOVE";
}
int Tree::height(Node* node)
{
//If tree empty
if (node == NULL)
return 0;
//If not empty, find max height
return 1 + max(height(node->leftBranch), height(node->rightBranch));
}
void Tree::addNum(int num)
{
Node *newNode = new Node;
newNode->myNum = num;
newNode->leftBranch = NULL;
newNode->rightBranch = NULL;
if (head == NULL)
{
head = newNode;
}
else
{
Node *cursor = head;
bool foundSpot = false;
while (!foundSpot)
{
if (num < cursor->myNum)
{
if (cursor->leftBranch != NULL)
cursor = cursor->leftBranch;
else
{
cursor->leftBranch = newNode;
foundSpot = true;
}
}
else
{
if (cursor->rightBranch != NULL)
cursor = cursor->rightBranch;
else
{
cursor->rightBranch = newNode;
foundSpot = true;
}
}
}
}
}
void Tree::deleteNodes(Node *node)
{
if (node == NULL)
return;
//Deletes subtrees
deleteNodes(node->leftBranch);
deleteNodes(node->rightBranch);
//Deletes node
delete node;
}
对于导致此错误的原因的任何帮助,将不胜感激。尝试访问deleteNodes(node-> leftBranch);时,问题代码似乎在deleteNodes(Node * node)中。
如果对节点代码的外观有任何疑问,这里为:
struct Node
{
int myNum;
Node *leftBranch;
Node *rightBranch;
};
答案 0 :(得分:0)
查找有问题的代码行。在Visual Studio中调试代码。 Tge调试器在检测到爬网时将停止。您可以使用调试器生成错误发生时代码所在位置的调用堆栈。
我怀疑在这种情况下,您正在访问指向已删除的内存的指针。调试堆有助于将已删除的内存设置为0xdd。
答案 1 :(得分:0)
您正在尝试对值等于NULL的指针进行操作。您可以将NULL替换为nullptr。
无论如何,我建议您使用C ++ 11智能指针(示例中的唯一指针,但可以根据您的应用程序共享)来重构实现:
#include <memory>
struct Node
{
int myNum;
std::unique_ptr<<node> pLeftBranch;
std::unique_ptr<<node> pRightBranch;
};
析构函数可以简单地使用默认实现(要在头文件中使用qt声明):
~Tree() = default;
节点* newNode =新节点变为:
std::unique_ptr<Node> pNewNode = std::make_unique<Node>();