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

Aym*_*ahi 1 c# c++ stack-overflow recursion

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

Die*_*ühl 6

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

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

  1. 可用的堆栈大小可能不同.
  2. 使用的堆栈帧的大小可能不同.
  3. 尾递归优化可以在一种情况下完成,但不能在另一种情况下完成.
  4. 一些系统能够动态增加其堆栈("拆分堆栈").

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