如果我正在做一个遍历树的递归算法......并且我知道它有很多数据,很大......在20分钟后,我得到一个“堆栈溢出”异常。但是StackOverFlow可能是因为代码中的其他错误,也许是因为无限循环...所以我只是想确保我在VisualStudio中获得的SOF错误是因为我的递归算法耗尽内存,而不是因为其他错误......当我们在递归算法中内存不足时,是否有特殊类型的错误消息或异常?我们在内存中的RAM很少时会遇到什么异常?
回答
System.OutOfMemoryException可以扔掉当内存不足。 System.StackOverflowException是你用一些递归的超复杂或者没有终止的情况来破坏调用堆栈。
是的,这也是正确的,也许我的递归算法不正确,并没有终止的情况。 。 – Bohn 2012-08-10 20:20:32
System.OutOfMemoryException
http://msdn.microsoft.com/en-us/library/system.outofmemoryexcetion.aspx
另外,作为@SLaks表示的StackoverflowException
从未发生过由于运行内存。
如果内存耗尽,那么你会得到一个OutOfMemory exception
要报告“低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#应用!):
recursion using only heap area
此外,检查了这一点...
编辑。在回答你的问题...
通常的情况是,如果你的应用程序试图超过堆栈空间,你会得到一个StackOverflowException。如果您的应用程序尝试超出堆空间,您将得到一个OutOfMemoryException。
- 1. 我不知道我为什么会遇到越界异常?
- 2. 为什么我在引用DataGridView CurrentRow时遇到异常?
- 3. 为什么我会遇到输入不匹配异常?
- 4. 为什么我会遇到SQLSyntaxErrorException - 遇到“”?
- 5. 为什么有时我会遇到“无效的事务对象”异常?
- 6. 为什么我有时会遇到“无法访问处置对象”的异常?
- 7. 为什么我在android中遇到异常
- 8. SQL Server中的超时异常很少
- 9. 查询一个值时,我经常会遇到SQLiteDoneException,为什么?
- 10. 为什么我在删除char *时出现内存异常?
- 11. 为什么我会遇到很多输出 - python?
- 12. 为什么我在执行Java的外部程序时遇到这个异常
- 13. 在PHP中,当我们使用mysql_query时,会在内存中发生什么
- 14. 为什么我得到异常异常?
- 15. 为什么我在谷歌云上的培训模型中遇到内存异常ml?
- 16. 我很困惑,为什么这段代码会抛出异常?
- 17. 什么是COM内存泄漏经常遇到的原因?
- 18. 当我抛出一个异常时,内存发生了什么?
- 19. 为什么我们用掷键异常
- 20. 为什么我在运行JXTA应用程序时遇到此异常?
- 21. 为什么我在调用函数两次时遇到了stackoverflow异常?
- 22. 为什么我没有得到一个内存异常这里
- 23. 如何找出在Ruby中遇到什么异常
- 24. 为什么我每次使用CFileDialog时都会收到异常?
- 25. 为什么我会遇到seg故障?
- 26. 当我遇到异常时,如何在crashlog中留言?
- 27. 为什么我会在意外时遇到?
- 28. 为什么有时我们不使用抛出新的异常?
- 29. 哈希值不存在时,为什么不会抛出异常?
- 30. 为什么我在指针操作中遇到访问冲突异常?
当您用完RAM时,StackOverflow永远不会发生。它发生在嵌套函数调用过多时。 – SLaks 2012-08-10 20:13:04
_我们有一个特殊类型的错误exception_是的,StackOverFlowException ... – 2012-08-10 20:13:21
@HenkHolterman我不能确定这是双关语的网站名称或不正确的评论..hmm – 2012-08-10 20:18:05