我必须为一个赋值做一个二分搜索树,在我删除我的树之前,一切都很好。这可能是我的一个非常简单的错误,但我不确定如何修复它。每次我运行程序,同时包含删除树的代码时,我都会得到“抛出异常:读取访问冲突。节点为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;
};
2条答案
按热度按时间lp0sw83n1#
查找有问题的代码行。在visual studio中调试代码。调试器将在检测到崩溃时停止。您可以使用调试器生成错误发生时代码所在位置的调用堆栈。
我怀疑在这种情况下,您正在访问一个指向已删除内存的指针。调试堆有助于将删除的内存设置为0xdd。
cetgtptt2#
你正在尝试对一个值等于NULL的指针进行操作。可以用nullptr替换NULL。
在任何情况下,我建议你使用C++11智能指针重构你的实现(示例中的唯一指针,但可能根据你的应用程序共享):
析构函数可以简单地使用默认实现(在头文件中使用qt声明):
Node *newNode = new Node变为: