2010-04-02 155 views
11

我有一個程序,實現幾個啓發式搜索算法和幾個域,旨在通過實驗評估各種算法。該程序使用C++編寫,使用GNU工具鏈構建,並在64位Ubuntu系統上運行。當我運行我的實驗時,我使用bash的ulimit命令來限制進程可以使用的虛擬內存量,以便我的測試系統不會開始交換。爲什麼我的程序在內存不足時偶爾會發生段錯誤,而不是拋出std :: bad_alloc?

某些算法/測試例組合擊中我已定義的內存限制。大多數情況下,程序拋出一個std :: bad_alloc異常,該異常由默認處理程序打印,此時程序終止。偶爾,而不是發生這種情況,程序只是段錯誤。

爲什麼當內存不足,而不是報告未處理的std :: bad_alloc的和終止我的程序偶爾段錯誤?

+0

段錯誤不僅可造成的,因爲你打的內存 – Andrey 2010-04-02 16:09:29

+0

限制,我很清楚。在我看到段錯誤的情況下,該過程一直在使用接近我指定限制的內存量。我非常有信心,我看到的段錯誤不是由於我的代碼中的錯誤。 – 2010-04-02 16:37:57

+1

您是否考慮過在GDB中簡單運行(以及其中的幾個),以查看哪些代碼段錯誤? – Shiroko 2010-04-02 17:01:15

回答

8

其中一個原因可能是由默認的Linux overcommits內存。從內核請求內存看起來可以正常工作,但後來當你真正開始使用內存時,內核注意到「哦,廢話,我內存不足」,調用內存不足(OOM)殺手,受害者進程並殺死它。

對於此行爲的描述,請參閱http://lwn.net/Articles/104185/

+0

可能。一些更多的信息,我一直在作爲測試系統上唯一擁有48GB內存的用戶運行。我一直在運行一個47GB的虛擬內存ulimit,這應該爲操作系統留下大量的核心內存。鏈接的文章是從2004年開始的。它今天仍然有用嗎? – 2010-04-02 16:40:17

1

說什麼janneb。事實上,Linux默認從不拋出std :: bad_alloc(或從malloc()返回NULL)。

+0

我假設你的意思是「std :: bad_alloc從不默認在Linux上拋出」。那麼,爲什麼當程序達到內存限制時,我會在幾個Linux系統上看到std :: bad_alloc從C++程序中拋出? – 2010-04-02 16:44:57

+0

另外,我認爲你的意思是'malloc'而不是'free'。 malloc的Linux手冊頁不會讓它聽起來像NULL永遠不會被返回。 – 2010-04-02 16:47:24

+0

@Bradford。你當然是對的。固定。 – 2010-04-02 16:56:40

1

它可以不使用拋出新的,不檢查返回值是一些代碼。

或者一些代碼可以捕捉異常,而不是處理,或重新拋出它。

相關問題