c++ 抛出的异常:读取访问冲突,**节点**为0xDDDDDDDD,发生

kupeojn6  于 2023-05-02  发布在  其他
关注(0)|答案(2)|浏览(365)

我必须为一个赋值做一个二分搜索树,在我删除我的树之前,一切都很好。这可能是我的一个非常简单的错误,但我不确定如何修复它。每次我运行程序,同时包含删除树的代码时,我都会得到“抛出异常:读取访问冲突。节点为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;
};
lp0sw83n

lp0sw83n1#

查找有问题的代码行。在visual studio中调试代码。调试器将在检测到崩溃时停止。您可以使用调试器生成错误发生时代码所在位置的调用堆栈。
我怀疑在这种情况下,您正在访问一个指向已删除内存的指针。调试堆有助于将删除的内存设置为0xdd。

cetgtptt

cetgtptt2#

你正在尝试对一个值等于NULL的指针进行操作。可以用nullptr替换NULL。
在任何情况下,我建议你使用C++11智能指针重构你的实现(示例中的唯一指针,但可能根据你的应用程序共享):

#include <memory>

struct Node
{
    int myNum;
    std::unique_ptr<<node> pLeftBranch;
    std::unique_ptr<<node> pRightBranch;
};

析构函数可以简单地使用默认实现(在头文件中使用qt声明):

~Tree() = default;

Node *newNode = new Node变为:

std::unique_ptr<Node> pNewNode = std::make_unique<Node>();

相关问题