2014-01-08 54 views
6

我想記錄,並可能向用戶發出警告,如果該程序應耗盡內存,讓他們有機會嘗試一些釋放(希望)。雖然我可以預分配給顯示的情況所需要的必要的GUI的實體,我擔心的是,使用更基本的操作cstdio如打開或寫入文件,在這種情況下是不可能的。將「內存不足」錯誤寫入文件,無內存?

我的問題是,如果一個程序不能再動態分配內存,是否仍然可以使用cstdio?我是否需要採取特殊措施,例如預先打開文件,或將其設置爲不使用緩衝區?請問cstring功能仍然可以運作?在這種情況下需要了解哪些其他可能的障礙?

(警告用戶在這種情況下的奢侈品,主要目標是錯誤記錄到文件中,然後嘗試用cstdio搶救的相關數據,然後向用戶發出警告,按照這個順序)

+3

當你得到這個錯誤可能爲時已晚,但你有同樣的錯誤,即使你無法分配足夠的**的連續空間**所以其他操作工作,即使一個分配請求失敗。我建議警告用戶(並記錄)空閒內存何時低於閾值**(此檢查的執行頻率取決於您的分配模式)。 –

+0

現在,內存並沒有預先彙集起來,它只是在需要的時候從操作系統中抓取。 (需要儘快改變)。儘管分配內存的方式,它會在記錄/警告之後重新嘗試分配內存。除非程序試圖在此之後分配更多內存(並導致崩潰),否則該方案不會更改,應該有可能恢復(希望!) –

+8

我們嘗試解決這個問題的方法之一是在註冊我們的異常處理程序時分配緩衝區,然後如果發生異常,我們將釋放緩衝區並希望有足夠的內存來允許處理程序寫出它需要的數據。 –

回答

1

短回答你的問題是「可能不是」(見這個答案:https://stackoverflow.com/a/6743056/789491)。有些開源版本的snprintf()不使用動態分配。我會用它和mmap(2)寫入你的文件。

我猜你想使用cstdio是你已經有一個使用cstdio一些花哨的記錄/序列化代碼的原因。鑑於此,我現在將把這個解決方案保持在高水平。

在這種情況下,在開始的時候我會分配大到足以容納你的錯誤信息,並恢復數據的緩衝器(一拉@退休忍者)。儘管(我的Linux機器上有4096個字節),但我至少將緩衝區的大小設置爲一頁。我也打開我想要寫入的日誌文件和mmap(2)該文件,並使用我希望的緩衝區大小。

在我的內存不足異常處理程序中,我首先釋放緩衝區(以便給我一些內存來處理),並使用snprintf的malloc免費版本在mmap'd文件中構造錯誤消息。然後,我會fsync文件(我沒有跟蹤fsync源代碼來驗證它是否分配了內存,或者分配了多少內存,但它應該小於cstdio)。然後關閉文件,做任何你想要的(GUI處理等),然後退出。

當我的程序正常退出,我只是刪除我用MMAP創建的日誌文件。

如果你想保存的數據量較大時(說比一個頁面大)而變,你可以簡單地分配一個頁面的緩衝區,並在同一時間建立你的日誌文件中一頁。或者你可以這樣做https://stackoverflow.com/a/8704032/789491

HTH。

--Jason