看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
aecho:每個process的heap區會有一個限制!?new會吃heap區~~ 06/16 09:44
yauhh:是啊,每個process可以挖的記憶體有個限制,processes總共的 06/16 11:23
yauhh:記憶體也有個限制. 總數比較簡單,只要衡量實體記憶體可用量 06/16 11:24
yauhh:即可. 每個process的上限多少,我還不知道上哪找資訊. 06/16 11:25
ledia:msdn 06/16 15:15
yauhh:喔,太感謝你這項資訊了 06/16 16:32
freelancer:unix : getrlimit, setrlimit 06/16 19:12