2012-08-10 56 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。

相關問題