2012-11-05 65 views
3

據我瞭解使用C的std :: bad_alloc的異常當程序運行的內存++被觸發。 有沒有一種方法來監視多少記憶中留下有和觸發特殊程序,我們到達的不歸路之前?福西的std :: bad_alloc的在C++

+1

您可以捕獲該異常並調用釋放你的一些動態內存的那麼特殊的程序。 – moooeeeep

+0

它依賴於系統,也取決於內核在需要時可以釋放的緩存。 –

+0

在標準C++中,唯一的方法是嘗試分配一個大數組,然後捕獲'bad_alloc'異常。但是在一個多線程程序中,答案可能會在你使用它之前發生改變......所以你實際上是在問錯誤的問題。 – Nemo

回答

5

不,但您可以註冊一個處理程序0123',全局operator new()的默認實現在循環中執行,直到處理程序不返回或沒有其他處理程序註冊。處理程序本身可能會嘗試釋放更多內存,或發佈日誌消息或其他類似內容。

多少內存的細節可爲您分配功能依賴極重度的平臺和操作系統上,雖然,所以不要抱太大的期望。

例如,對超額訂購的存儲系統,您的分配可能成功,但你的程序仍然可以死,因爲系統內存不足。

+0

隨着過量使用,您的程序可以一樣好,即使它不分配內存死,因爲一些其他* *過程吃光了所有的餡餅。 –

+0

@SteveJessop:啊,是的,挺。我想重點是,在普通的桌面操作系統上,將系統範圍的內存管理整合到自己的應用程序中很困難(也許你應該不打擾?)。 –

+0

@SteveJessop:C++規範是否允許「overcommit」?我不認爲它確實如此......除非我錯過了它,否則任何地方都不會讓你的進程崩潰,只是因爲它觸及了由'new'正確返回的內存。嚴格地說,啓用overcommit的Linux不是一個合格的C++平臺。或者我錯了? – Nemo