2012-08-05 61 views

回答

4

這不是一個新的內存分配器,而是一個可以註冊的函數,以便在operator new內存不足時調用它。

如果你可以神奇地修復內存不足的問題,new可以再試一次,看看它現在是否更好。這通常不是很有用,除非你的應用程序持有它可以釋放的一些內存。

-1

我認爲「低存儲量」實際上表明你正在鏈接的答案中「內存不足」。有很多通過搜索關於set_new_handler(例如http://www.cplusplus.com/reference/std/new/set_new_handler/

一個實施我看到(在生產代碼爲一個特別內存密集型應用程序)一起使用該鉤子安裝存儲器外的一個處理程序中的示例代碼片段的在應用程序啓動時,「雨天」塊分配〜10MB。如果這個處理程序被觸發,它會刪除內存並嘗試進入「受控出口」路徑。

在實踐中,我發現這不是一種非常有效的技術,因爲行爲一旦你內存不足已經不可預測。

+0

Downvotes沒有解釋沒有幫助,特別是當這個答案解決了OP請求,並且以真實世界的經驗支持它時。請證明理由? – holtavolt 2012-08-05 23:12:59

1

下面是一些新處理程序可能有用的示例。

  1. 假設你是一個類Unix機上的系統管理員已經因爲某些原因,設置堆大小的低軟限制上。新的處理程序可以將軟限制提高到硬限制,瞧!新的內存可能可用。

  2. 假設您希望您的應用程序佔用所有內存,但其他正在運行的應用程序正在運行。所以,讓你的新處理器睡一會兒吧。當其中一個已經運行的程序終止時,viola!新的內存可用。

至少有一個商業應用程序採用選項#2。這幾乎總是一個錯誤。通常情況下,應用程序內存不足,因爲應用程序的用戶無意中嘗試分配比任何計算機上存在的內存更多的內存。隨着其他正在運行的應用程序退出,應用程序將愉快地獲得更多內存。最終不能啓動新的程序,包括操作系統需要運行的程序。這個應用程序是一個相當不錯的工具,使機器崩潰到膝蓋。

+0

我重申holtavolt對不留言的隨機downvoters的評論。我已經看到了我在現實世界中使用的答案中概括的兩種方法。選項#1,逐漸提高堆大小的軟限制,在某些系統上推薦使用。也許愚蠢,但建議練習。選項#2,像禿鷲一樣盤旋,等待其他程序死亡,這是一種被廣泛使用的商業工具所使用的方法。 – 2012-08-14 18:09:17