2012-08-10 58 views
0

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

+4

当您用完RAM时,StackOverflow永远不会发生。它发生在嵌套函数调用过多时。 – SLaks 2012-08-10 20:13:04

+0

_我们有一个特殊类型的错误exception_是的,StackOverFlowException ... – 2012-08-10 20:13:21

+0

@HenkHolterman我不能确定这是双关语的网站名称或不正确的评论..hmm – 2012-08-10 20:18:05

回答

1

System.OutOfMemoryException可以扔掉当内存不足。 System.StackOverflowException是你用一些递归的超复杂或者没有终止的情况来破坏调用堆栈。

+0

是的,这也是正确的,也许我的递归算法不正确,并没有终止的情况。 。 – Bohn 2012-08-10 20:20:32

1

要报告“低RAM”最接近的是OutOfMemoryException,但只有当足够的连续RAM不能分配给下一个操作时。这并不意味着主机的内存不足。

StackOverflowException可能包含此作为内部异常,但我不知道。

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. 
} 
+0

我不知道那..感谢我会盯着你的榜样学习和使用它。 – Bohn 2012-08-10 20:26:05

+0

您可以切换到“队列”而不是“堆栈”(并使用队列和出队代替推送和弹出)来改变宽度优先遍历, – spender 2012-08-10 20:28:00

1

我跑了自己一个小小的递归实验,这给了我约87000次迭代之前用完堆栈空间。方法调用总是使用栈而不是堆。如果有一种方法可以创建一个堆栈,那么你可能会更多一些。在这方面,请阅读下面的文章(虽然它可能不是在C#应用!):

recursion using only heap area

此外,检查了这一点...

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

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

通常的情况是,如果你的应用程序试图超过堆栈空间,你会得到一个StackOverflowException。如果您的应用程序尝试超出堆空间,您将得到一个OutOfMemoryException。

相关问题