引发异常:读取访问冲突。 **节点**为0xDDDDDDDD。发生

时间:2018-10-03 19:34:28

标签: c++

我必须为任务分配一个二叉搜索树,并且一切都很好,直到删除我的树为止。就我而言,这可能是一个非常简单的错误,但我不确定如何解决。每次我在运行程序时(包括删除树的代码),都会收到“抛出异常:读取访问冲突。节点为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 个答案:

答案 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>();