2009-12-28 77 views
3

雖然不會經常發生,但有些情況下,我的Cocoa應用程序會分配非常大量的內存,足以讓我擔心malloc失敗。在Cocoa應用程序中處理這種失敗的最好方法是什麼?我聽說在這個開發環境中異常通常是不受歡迎的,但是這種情況下它們會有用嗎?處理可可中的malloc失敗的最佳方式

回答

5

如果你有一個分配失敗,因爲你出的內存,較有可能出現了一些框架的分配錯誤的地方,離開了應用程序處於不確定的狀態。

即使情況並非如此,你不能做任何東西將分配內存,並給你很少的選擇。

即使釋放內存,企圖「修復」的問題是不會持續工作,即使不通過顯示一個不錯的錯誤信息,並退出乾淨地「修理」它。

您也不想嘗試保存此狀態的數據。或者,至少,並非沒有編寫處理讀取時損壞數據所需的所有代碼(因爲失敗的分配很可能意味着某些代碼在某處損壞了內存)。

將分配失敗視爲致命,日誌和退出。

它是極其對於正確編寫的應用程序用盡內存不常見。更有可能的是,當應用程序內存不足時,用戶的系統將會像地獄般分頁,因此,在分配失敗之前,性能已經顯着降低。

您將重點放在優化和減少內存使用方面的投資回報將比試圖從分配失敗中恢復時大得多。

(Alan的原始答案和他的編輯一樣準確)。

1

如果你正在運行到內存分配錯誤,你不應該試圖處理它們,而是重新思考你的應用程序如何使用內存。

我不確定Cocoa成語是什麼,但對於C++和C#來說,內存不足是異常問題的標誌,最好留給用戶/操作系統處理。

說你的內存分配失敗了,你的系統還能做什麼?剩下多少內存?在關閉之前顯示對話框/打印信息就足夠了嗎?會拋出異常成功嗎?清理資源是否會導致級聯內​​存異常?

如果malloc的失敗,你會得到一個空回來,所以如果是這樣的話,可以申請繼續沒有記憶?如果不是這樣,請將該情況視爲致命錯誤,並以用戶有用的消息退出。

+0

當你分配大量內存時,你還不應該擔心嗎?一個簡單的「你內存不足」通知比分段錯誤更方便用戶使用(當然,不足以檢查每一個錦葵)。 – 2009-12-28 08:45:03

+0

你提出了一個好點。 – Alan 2009-12-28 08:49:26

0

如果內存不足,通常沒有太多可以做到終止您的應用程序。即使顯示通知可能會失敗,因爲沒有足夠的內存。

標準C程序是寫一個void xmalloc(size_t size);函數,將檢查的malloc的返回值,並且如果NULL,打印出錯誤到stderr,然後調用abort()。這樣你只需在整個代碼中使用xmalloc,而不用考慮它。如果你的內存不足,運氣不好,你的應用程序將會死亡。

相關問題