2010-12-20 119 views
1

我想知道,什麼是處理內存不足錯誤的好做法。處理內存不足錯誤的最佳做法是什麼?

void SomeTask() 
{ 
    try 
    { 
     SomeObj obj = new SomeObj(); 
    } 
    catch(std::bad_alloc&) 
    { 
     // What should be done here? 
    } 


    // ... more code ... 
} 

我覺得自己默默地返回是錯誤的,因爲程序可能運行在一個不確定的狀態。那麼,這裏應該發生什麼,我應該離開程序崩潰,還是有更好的選擇?該程序作爲服務運行,所以我不能只彈出錯誤消息。我想如果有足夠的內存來做這件事,可能會記錄一些東西。但是,我只是想知道,在這種情況下,你認爲我應該怎麼做?

謝謝。

+6

首先,不要測試null。抓住'std :: bad_alloc'。 – 2010-12-20 17:13:10

+0

好的,謝謝,明白了。 – 2010-12-20 17:20:06

+3

其次,除非你能解決它,否則不要捕獲bad_alloc。這在分配點幾乎沒有任何地方。如果這是由主事件循環啓動的某種服務,則允許該服務退出並一直回退到事件循環。如果這是普通應用程序流程的一部分,那麼通常的結果就是讓拋出導致應用程序終止。捕獲並記錄main()中的所有異常,然後重新拋出異常。 – 2010-12-20 18:27:46

回答

5

由於這是一項服務,我會在系統消息日誌中寫入錯誤。在Windows中,您可以使用Windows Event Log API。除非您在文檔中另有說明,否則這可能是系統管理員希望看到失敗報告的地方。另外,在大多數C++編譯器中,對於失敗的堆分配,std :: bad_alloc()已經取代了空返回值。

-PaulH

+1

如果你得到一個'std :: bad_alloc',機會並不會很渺茫。 – wilhelmtell 2010-12-20 18:44:51

2

由於它作爲服務運行,最好讓它崩潰,但要以可控的方式做到這一點首先記錄錯誤狀態,然後中止或自行終止。服務控制管理器可以配置爲在服務停止不受控制時重新啓動服務。

如果可能,您可以進一步強制進行自身的控制轉儲,這可以找出問題的原因。

你的直覺是正確的,讓它死亡,因爲還有什麼過程要做?一旦它進入內存不足狀態,它將永遠不會恢復到健康狀態。 RIP過程。

+0

「從不」可能有點過於強大。有些情況下您可以從OOM狀態恢復。但在一般情況下,你是對的,除了讓它終止之外,你無能爲力。 – jalf 2010-12-20 18:36:29

+0

你說得對,我可以用「很可能不會」恢復到健康的狀態。然而,在終止前傾銷的好處是巨大的。 – 2010-12-20 19:56:09

2

你應該做的第一件事是嘗試釋放更多的內存。如果您必須定期清理對象,現在是時候完成它了。如果一切順利,您可以繼續跑步。

如果不這樣做,你應該嘗試保存任何需要保存到磁盤並死亡,如果你需要額外的內存,確保你在啓動時抓住它。由於繼續運行是不可能的,您應該死亡(abort或重新拋出異常)。

相關問題