如果我正在做一个递归算法来遍历一棵树......我知道它有很多数据,巨大的。大约 20 分钟后,我收到"堆栈溢出"异常。但是StackOverFlow可能是因为代码中的其他错误,也许是因为无限循环...所以我只是想确保我在 VisualStudio 中遇到的这个 SOF 错误是因为我的递归算法耗尽了 RAM,而不是因为其他错误......当我们在递归算法中耗尽内存时,我们是否有特殊类型的错误消息或异常?
如果内存不足,则会出现内存不足异常
System.OutOfMemoryException
http://msdn.microsoft.com/en-us/library/system.outofmemoryexcetion.aspx
此外,正如@SLaks所指出的那样,由于内存不足,StackoverflowException
永远不会发生。
System.OutOfMemoryException 可以在内存不足时抛出。System.StackOverflowException是你已经用递归的超复杂或没有终止大小写的东西破坏了调用堆栈。
最接近报告"低 RAM"的是 OutOfMemoryException,但这只是当无法为下一个操作分配足够的连续 RAM 时。这并不意味着主机的内存不足。
StackOverflowException可能包含它作为内部异常,但我不确定。
如果你的树很深,为什么不管理自己的堆栈而不是使用递归呢?像这样:
Stack<Node> stack = new Stack<Node>();
stack.Push(rootNode);
Node currentNode;
while( (currentNode = stack.Pop()) != null)
{
foreach(var childNode in currentNode.Children)
{
stack.Push(childNode);
}
//process this node.
}
我自己运行了一些递归实验,在耗尽堆栈空间之前给了我大约 87000 次迭代。方法调用始终使用堆栈而不是堆。如果有一种方法可以创建基于堆的堆栈,那么您可能会得到更多。在这方面,请阅读以下文章(尽管它可能不适用于 C#!
仅使用堆区域的递归
另外,看看这个...
http://joel.inpointform.net/software-development/explanation-of-stack-heap-and-recursion-causing-stack-overflow/
编辑。回答您的问题...
通常的情况是,如果您的应用程序试图超过堆栈空间,您将获得StackOverflowException。如果您的应用程序尝试超出堆空间,您将获得内存不足异常