c# - c++和c#在栈溢出异常方面的区别

标签 c# c++ recursion stack-overflow

当我用 C# 编写一些代码时,我有一个递归方法,在调用几千次后导致堆栈溢出异常。
所以过了一段时间,我用 C++ 编写了相同的代码,它运行良好,没有任何异常(即使递归调用的实际数量比 C# 停止的地方多大约 10 倍)。
C# 和 C++ 在处理这个问题上有什么区别?有什么方法可以允许在 C# 中进行更多递归调用而不抛出异常?

最佳答案

C# 和 C++ 中 stackoverflow 最显着的区别是:C++ 没有“堆栈溢出异常”(*)。使用 C++ 溢出堆栈的结果只是未定义的行为。它可能会做您期望它做的事情,但也可能会做一些完全不同的事情。如果幸运的话,程序会崩溃(由于在堆栈末尾分配了一个 protected 页面而导致分段冲突),如果运气不好,直到在某个时候尝试访问现在被覆盖的内存时,才会检测到 stackoverflow .

其他可能影响递归调用的因素:

  1. 可用的筹码量可能不同。
  2. 使用的堆栈帧的大小可能不同。
  3. 尾递归优化可以在一种情况下进行,但不能在另一种情况下进行。
  4. 一些系统能够动态增加它们的堆栈(“拆分堆栈”)。

(*) 由于行为未定义,某些实现可能会定义一个 stackoverflow 异常并在适当的条件下抛出该异常;但是,没有这样的保证。

关于c# - c++和c#在栈溢出异常方面的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37527350/

相关文章:

c++ - MATLAB 上的矩阵操作到 C++ 或 OpenCV

c# - 如何将 "unroll"构造成 "recursive"

c# - 如何将 Linq2SQL 集合数据绑定(bind)到 winform 文本字段

c# - Enum.HasFlag,为什么没有 Enum.SetFlag?

c++ - 我正在尝试在不同线程上的Windows API中使用OpenGL

C++17,制作一个使用依赖于模板参数的 std::variant 的可变参数模板?

scala - 来自 "Programming Scala"的合并排序导致堆栈溢出

javascript - 创建jquery无限动画不使用递归?

c# - 关于DNS解析使用[System.Net.Dns] : how does it work and what port does it use?的两个问题

c# - WPF 将基于几何图形的图像绑定(bind)到 MenuItem.Icon 属性