使用按顺序遍历成员函数时引发异常(堆栈溢出)的问题

Posted

技术标签:

【中文标题】使用按顺序遍历成员函数时引发异常(堆栈溢出)的问题【英文标题】:Having an issue with an exception (Stack overflow) being thrown when using an In Order traversal member function 【发布时间】:2019-08-07 19:22:48 【问题描述】:

我正在尝试在二叉搜索树上测试我的递归按顺序遍历函数,但是当我调用该特定函数以显示树上的节点时,我不断抛出异常(堆栈溢出)。我错过了代码的关键部分吗?

我尝试在其他地方查找如何处理异常,但到目前为止没有任何效果。我还将函数更改为 const,因为我不确定编译器 (Visual Studio 2017) 是否想要这样做。我已经测试了 Pre-Order 和 Post-Order 遍历函数,并且都按预期工作。

按顺序遍历函数是另一个类的私有成员函数,由一个单独的公共函数调用,该函数简单地将树的root 传递给displayInOrder

void displayInOrder(TreeNode *&root) const 

        if (root == NULL) 

            return;

        

        else if (root) 

            displayInOrder(root);
            cout << root->value << " ";
            displayInOrder(root->right);
        
    

在二叉树 Application.exe 中的 0x00C22FE9 处引发异常: 0xC0000005:访问冲突写入位置0x00CA0F60。

【问题讨论】:

当 *** 上的问题是关于堆栈溢出时,我总是觉得很有趣。 哈哈,我也是这么想的! else if (root) -- 您已经测试过root 是否为 NULL。不需要else if (root) 【参考方案1】:
displayInOrder(root);

应该是

displayInOrder(root->left);

第一个版本是无限递归的,因为您使用完全相同的参数调用相同的函数。如您所见,这会导致堆栈溢出。

【讨论】:

哇,成功了!我不敢相信我错过了!你是上帝派来的! @ChristianDominguez 如果这是 Visual Studio,则在引发异常时查看堆栈帧。这会告诉你很多。 注明。谢谢你的提示! @drescherjm

以上是关于使用按顺序遍历成员函数时引发异常(堆栈溢出)的问题的主要内容,如果未能解决你的问题,请参考以下文章

C# 捕获堆栈溢出异常

傻程序中的堆栈溢出异常

函数 堆栈溢出

使用 dynamic_pointer_cast 时出现异常 0xC0000409(堆栈缓冲区溢出)[关闭]

winsock 选择函数中的堆栈溢出异常 (0xC00000FD)

带有尾递归函数c ++的堆栈溢出