0

如果我正在做一个递归算法来遍历一棵树……我知道它有很多数据,巨大的……大约 20 分钟后,我得到一个“堆栈溢出”异常。但是 StackOverFlow 可能是因为代码中的其他一些错误,可能是因为无限循环......所以我只是想确保我在 VisualStudio 中遇到的这个 SOF 错误是因为我的递归算法用完了 RAM,而不是因为其他错误...当我们在递归算法中耗尽内存时,我们是否有特殊类型的错误消息或异常?

4

6 回答 6

3

如果内存不足,则会出现OutOfMemory 异常

于 2012-08-10T20:13:10.267 回答
2

System.OutOfMemoryException

http://msdn.microsoft.com/en-us/library/system.outofmemoryexcetion.aspx

同样正如@SLaks 指出的StackoverflowException那样,由于内存不足,永远不会发生。

于 2012-08-10T20:13:05.447 回答
1

内存不足时会抛出System.OutOfMemoryException 。System.StackOverflowException是您使用递归超复杂或没有终止案例的东西破坏了调用堆栈。

于 2012-08-10T20:14:05.963 回答
1

您必须报告“低 RAM”的最接近的事情是OutOfMemoryException,但这只是在无法为下一个操作分配足够的连续 RAM 时。这并不意味着主机内存不足。

StackOverflowException 可能包含这个作为内部异常,但我不确定。

于 2012-08-10T20:14:32.090 回答
1

如果你的树很深,为什么不管理自己的堆栈而不是使用递归呢?就像是:

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.
}
于 2012-08-10T20:24:46.123 回答
1

我给自己做了一个小递归实验,在耗尽堆栈空间之前给了我大约 87000 次迭代。方法调用总是使用堆栈而不是堆。如果有一种方法可以创建基于堆的堆栈,那么您可能会做得更多。在这方面,请阅读以下文章(尽管它可能不适用于 C#!):

仅使用堆区域的递归

另外,看看这个...

http://joel.inpointform.net/software-development/explanation-of-stack-heap-and-recursion-causing-stack-overflow/

编辑。在回答你的问题...

通常情况是,如果您的应用程序试图超出堆栈空间,您将收到 StackOverflowException。如果您的应用程序试图超出堆空间,您将收到 OutOfMemoryException

于 2012-08-10T21:01:55.047 回答