2011年1月3日 星期一

有需要檢查 new 失敗的情形嗎

作者: yauhh (喲) 看板: C_and_CPP
標題: Re: [問題] 有需要檢查 new 失敗的情形嗎?
時間: Tue Jun 16 02:17:06 2009

※ 引述《os653 (allstar)》之銘言:
: 想請問
: new 失敗的原因是什麼?
: 我的猜想是
: 每個程式在執行時由系統配置了一塊虛擬出來的記憶體
: 如果這塊虛擬記憶體上沒有足夠的連續空間供 new 使用
: new 就會失敗
..
: 請問實際情況是哪個呢?

曾做過一個很小的測試將記憶體盡可能吸乾,同時觀察系統資源,
得到的概念是:

實體記憶體用完了會有虛擬記憶體頂,直到系統提供不了更多虛擬記憶體.
能使用的虛擬記憶體,與系統可使用的 page file 大小有關;
當然 page file 也跟實體記憶體有關.
測試系統是 Windows.

而記憶體快要不夠的時候,任何一個程式差不多都一樣難以行動.
所以,似乎不必管有沒有辦法 new 成功.
假如沒辦法 new 成功,當然是得到系統記憶體不足的訊息並且直接中斷程式了.
不用忙著做記憶體防呆; 如果要做,就先讀出系統記憶體有多少可用,
衡量夠不夠自己程式使用,如果不夠就做適當的反應,例如回報失敗訊息.

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.112.229.146
※ 編輯: yauhh           來自: 59.112.229.146       (06/16 02:18)
推 os653:我現在是認為單獨處理 new 失敗的情況沒有意義,但是用設置   06/16 03:07
→ os653:new_handler 的方法是可行的,不過要怎麼處理就是問題囉。    06/16 03:08
→ os653:有看過書上預先要一塊備用記憶體,new 失敗的時候在 handler  06/16 03:09
→ os653:釋放,再將重要資訊儲存下來。而我想寫的程式沒有這種重要資  06/16 03:11
→ os653:訊必須儲存,所以我在考慮 new handler 裡面要寫什麼,如果   06/16 03:12
→ os653:什麼都不寫還有機會成功,那是最好,不然的話就直接 exit 也  06/16 03:12
→ os653:可以,只要不要當掉就好囉。現在就差在有沒有機會靠著無限次  06/16 03:16
→ os653:重試那裡,如果真的有機會重新 new 成功的話,我會選擇這個   06/16 03:17
→ os653:方法,不然就跟您說的一樣,直接中斷程式囉。                06/16 03:18
→ yauhh:上面寫的直接中斷程式不是指程式寫中斷程式的敘述,而是...    06/16 03:19
→ yauhh:系統無法提供記憶體,於是強制中斷程式.                      06/16 03:20
→ yauhh:我說的方法是:為了避免強制中斷,自己程式先確認可用的記憶體  06/16 03:21
推 os653:您是指 windows 會直接自動把程式關掉?這就真的無解了 ...   06/16 03:52
→ os653:另外可以請問有簡單的 function 可以確認還有多少記憶體嗎?  06/16 04:00
推 os653:好像找到了,看來 GlobalMemoryStatusEx 似乎可以看到的樣子  06/16 04:11

沒有留言:

張貼留言

您好.本資料庫並非第一手資料.如果你有對文章作者的詢問,意見與需求,請自行找尋文章作者並提供意見,謝謝.