当我在C#中编写一些代码时,我有一个递归方法,在几千次调用后导致堆栈溢出异常。
所以过了一会儿,我在C ++中编写了相同的代码并且它没有例外地工作正常(即使递归调用的实际数量比C#停止的情况多10倍)。
C#和C ++在处理这个问题上有什么区别?有没有什么方法可以允许在C#中进行更多的递归调用而不抛出异常?
答案 0 :(得分:6)
C#和C ++中stackoverflow最显着的区别是:C ++没有“堆栈溢出异常”(*)。使用C ++溢出堆栈的结果只是未定义的行为。它可以做你期望它做的事情,但也可能做一些完全不同的事情。如果你运气好的话,程序会崩溃(由于在堆栈末尾分配了受保护的页面而导致分段违规),如果你运气不好,直到某个时候才会检测到堆栈溢出,现在尝试访问覆盖的内存
可能会导致递归调用的其他因素:
(*)由于行为未定义,某些实现可能会定义stackoverflow异常并在适当的条件下抛出异常;但是,没有这样的保证。