簡體   English   中英

為什么我的程序在內存不足時會偶爾發生段錯誤而不是拋出std :: bad_alloc?

[英]Why does my program occasionally segfault when out of memory rather than throwing std::bad_alloc?

我有一個程序實現了幾個啟發式搜索算法和幾個域,旨在通過實驗評估各種算法。 該程序是用C ++編寫的,使用GNU工具鏈構建,並在64位Ubuntu系統上運行。 當我運行我的實驗時,我使用bash的ulimit命令來限制進程可以使用的虛擬內存量,以便我的測試系統不會開始交換。

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

為什么我的程序在內存不足時偶爾會出現段錯誤,而不是報告未處理的std :: bad_alloc並終止?

一個原因可能是默認情況下Linux會過度使用內存。 從內核請求內存似乎工作正常,但稍后當你真正開始使用內存時,內核注意到“哦,廢話,我的內存不足”,調用內存不足(OOM)殺手選擇一些內存受害者進程並殺死它。

有關此行為的說明,請參閱http://lwn.net/Articles/104185/

它可能是一些使用no-throw new的代碼,而不是檢查返回值。

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

什么janneb說。 實際上Linux默認情況下不會拋出std :: bad_alloc(或者從malloc()返回NULL)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM