雖然不會經常發生,但有些情況下,我的Cocoa應用程序會分配非常大量的內存,足以讓我擔心malloc失敗。在Cocoa應用程序中處理這種失敗的最好方法是什麼?我聽說在這個開發環境中異常通常是不受歡迎的,但是這種情況下它們會有用嗎?處理可可中的malloc失敗的最佳方式
回答
如果你有一個分配失敗,因爲你出的內存,較有可能出現了一些框架的分配錯誤的地方,離開了應用程序處於不確定的狀態。
即使情況並非如此,你不能做任何東西將分配內存,並給你很少的選擇。
即使釋放內存,企圖「修復」的問題是不會持續工作,即使不通過顯示一個不錯的錯誤信息,並退出乾淨地「修理」它。
您也不想嘗試保存此狀態的數據。或者,至少,並非沒有編寫處理讀取時損壞數據所需的所有代碼(因爲失敗的分配很可能意味着某些代碼在某處損壞了內存)。
將分配失敗視爲致命,日誌和退出。
它是極其對於正確編寫的應用程序用盡內存不常見。更有可能的是,當應用程序內存不足時,用戶的系統將會像地獄般分頁,因此,在分配失敗之前,性能已經顯着降低。
您將重點放在優化和減少內存使用方面的投資回報將比試圖從分配失敗中恢復時大得多。
(Alan的原始答案和他的編輯一樣準確)。
如果你正在運行到內存分配錯誤,你不應該試圖處理它們,而是重新思考你的應用程序如何使用內存。
我不確定Cocoa成語是什麼,但對於C++和C#來說,內存不足是異常問題的標誌,最好留給用戶/操作系統處理。
說你的內存分配失敗了,你的系統還能做什麼?剩下多少內存?在關閉之前顯示對話框/打印信息就足夠了嗎?會拋出異常成功嗎?清理資源是否會導致級聯內存異常?
如果malloc的失敗,你會得到一個空回來,所以如果是這樣的話,可以申請繼續沒有記憶?如果不是這樣,請將該情況視爲致命錯誤,並以用戶有用的消息退出。
如果內存不足,通常沒有太多可以做到終止您的應用程序。即使顯示通知可能會失敗,因爲沒有足夠的內存。
標準C程序是寫一個void xmalloc(size_t size);
函數,將檢查的malloc的返回值,並且如果NULL,打印出錯誤到stderr,然後調用abort()。這樣你只需在整個代碼中使用xmalloc
,而不用考慮它。如果你的內存不足,運氣不好,你的應用程序將會死亡。
- 1. 處理失敗的nonce驗證的最佳方式是什麼?
- 2. 什麼是處理失敗的Web請求的最佳方式?
- 3. Android中處理XML的最佳方式
- 4. 最佳方式處理
- 5. 處理失敗的memcache服務器的最佳方式是什麼?
- 6. NullPointerException和處理它的最佳方式
- 7. 從C#處理.dbf的最佳方式
- 8. 處理樹數組的最佳方式
- 9. 處理「重複」的最佳方式
- 10. 處理資源的最佳方式
- 11. 處理WCF超時的最佳方式
- 12. 錯誤處理的最佳方式
- 13. 處理多個NSTableView的最佳方式
- 14. 處理Braintree超時的最佳方式
- 15. 在Angular中處理大量可選參數的最佳方法
- 16. 在Spring中處理可選輸入RESTful API的最佳方法
- 17. 在Zend框架中處理會話處理的最佳方式
- 18. 失去焦點時處理鍵盤事件的最佳方式
- 19. 在linux中創建子進程並處理可能的失敗的最佳方法
- 20. 處理中途失敗的多表Laravel遷移的最佳方法?
- 21. 在Insight.Database中處理可空參數的權利/最佳方式是什麼?
- 22. 在MySql中處理零對一(可選)外鍵關係的最佳方式
- 23. 什麼是在可可中處理模板選取器的最佳方法
- 24. 用於可視化和無3D處理的最佳處理器
- 25. 處理可變內容保證金的最佳實踐方法?
- 26. 集羣可視化的最佳方式
- 27. 最佳方式來處理存儲在STD(可能爲null)的char * :: string的
- 28. MSAccess:錯誤3146 ODBC調用失敗 - 處理的最佳策略?
- 29. cocos2dx中的最佳處理方法
- 30. 清理不可參數化的sql的最佳方式
當你分配大量內存時,你還不應該擔心嗎?一個簡單的「你內存不足」通知比分段錯誤更方便用戶使用(當然,不足以檢查每一個錦葵)。 – 2009-12-28 08:45:03
你提出了一個好點。 – Alan 2009-12-28 08:49:26