当我用C#编写一些代码时,我有一个递归方法,它在几千次调用后导致堆栈溢出异常。
因此,过了一段时间,我用C++编写了相同的代码,它运行良好,无一例外(尽管递归调用的实际数量大约是C#停止的次数的10倍)。
C#和C++在处理这个问题上有什么区别?我是否可以允许在C#中进行更多的递归调用,而不会引发异常?
发布于 2016-05-30 06:05:50
C#和C++中堆栈溢出最显著的区别是: C++没有“堆栈溢出异常”(*)。使用C++溢出堆栈的结果只是未定义的行为。它可以做你希望它做的事情,但它也可能做一些完全不同的事情。如果运气好,程序就会崩溃(因为在堆栈末尾分配了受保护的页面而导致分段冲突),如果您运气不好,直到某个时候尝试访问现在覆盖的内存,堆栈溢出才会被检测到。
其他可能被考虑到递归调用的事情:
(*)由于行为未定义,一些实现可能定义堆栈溢出异常,并在适当的条件下抛出该异常;然而,没有这样的保证。
https://stackoverflow.com/questions/37527350
复制