堆栈溢出异常中c ++和c#之间的区别

时间:2016-05-30 13:49:40

标签: c# c++ recursion stack-overflow

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

1 个答案:

答案 0 :(得分:6)

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

可能会导致递归调用的其他因素:

  1. 可用的堆栈大小可能不同。
  2. 使用的堆栈帧的大小可能不同。
  3. 尾递归优化可以在一种情况下完成,但不能在另一种情况下完成。
  4. 某些系统能够动态增加其堆栈(“拆分堆栈”)。
  5. (*)由于行为未定义,某些实现可能会定义stackoverflow异常并在适当的条件下抛出异常;但是,没有这样的保证。