如果我正在做一個遍歷樹的遞歸算法......並且我知道它有很多數據,很大......在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. 如果GC完成其工作,我們爲什麼會遇到內存不足異常?
- 3. 爲什麼我在從xml讀取元素時遇到異常
- 4. 爲什麼我在引用DataGridView CurrentRow時遇到異常?
- 5. 爲什麼我在使用multiprocessing.Pool時遇到異常?
- 6. 爲什麼我會遇到:com.paypal.sdk.exceptions.TransactionException異常:(403)禁止
- 7. 有誰知道我爲什麼會遇到空異常錯誤?
- 8. 爲什麼我會遇到輸入不匹配異常?
- 9. 爲什麼我得到這個內存異常異常?
- 10. 處理SqlConnection,SqlDataReader,SqlCommand時會遇到什麼異常?
- 11. 我在tomcat控制檯中遇到了內存泄漏異常
- 12. 我爲什麼會遇到異常:嘗試登錄到mongodb時登錄失敗?
- 13. 爲什麼我會遇到SQLSyntaxErrorException - 遇到「」?
- 14. 爲什麼我有時會遇到「無法訪問處置對象」的異常?
- 15. 爲什麼有時我會遇到「無效的事務對象」異常?
- 16. 爲什麼我在android中遇到異常
- 17. SQL Server中的超時異常很少
- 18. 查詢一個值時,我經常會遇到SQLiteDoneException,爲什麼?
- 19. 爲什麼我在刪除char *時出現內存異常?
- 20. 手機內存充滿時會拋出什麼異常?
- 21. 爲什麼我會遇到很多輸出 - python?
- 22. 爲什麼我在執行Java的外部程序時遇到這個異常
- 23. 在PHP中,當我們使用mysql_query時,會在內存中發生什麼
- 24. 爲什麼我得到異常異常?
- 25. 爲什麼我在谷歌雲上的培訓模型中遇到內存異常ml?
- 26. 我很困惑,爲什麼這段代碼會拋出異常?
- 27. 爲什麼我會遇到這個錯誤 - 「缺少令牌」?
- 28. 什麼是COM內存泄漏經常遇到的原因?
- 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