Re: [問題] 有需要檢查 new 失敗的情形嗎?

看板C_and_CPP (C/C++)作者 (喲)時間16年前 (2009/06/16 02:17), 編輯推噓5(5018)
留言23則, 5人參與, 最新討論串5/5 (看更多)
※ 引述《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)

06/16 03:07, , 1F
我現在是認為單獨處理 new 失敗的情況沒有意義,但是用設置
06/16 03:07, 1F

06/16 03:08, , 2F
new_handler 的方法是可行的,不過要怎麼處理就是問題囉。
06/16 03:08, 2F

06/16 03:09, , 3F
有看過書上預先要一塊備用記憶體,new 失敗的時候在 handler
06/16 03:09, 3F

06/16 03:11, , 4F
釋放,再將重要資訊儲存下來。而我想寫的程式沒有這種重要資
06/16 03:11, 4F

06/16 03:12, , 5F
訊必須儲存,所以我在考慮 new handler 裡面要寫什麼,如果
06/16 03:12, 5F

06/16 03:12, , 6F
什麼都不寫還有機會成功,那是最好,不然的話就直接 exit 也
06/16 03:12, 6F

06/16 03:16, , 7F
可以,只要不要當掉就好囉。現在就差在有沒有機會靠著無限次
06/16 03:16, 7F

06/16 03:17, , 8F
重試那裡,如果真的有機會重新 new 成功的話,我會選擇這個
06/16 03:17, 8F

06/16 03:18, , 9F
方法,不然就跟您說的一樣,直接中斷程式囉。
06/16 03:18, 9F

06/16 03:19, , 10F
上面寫的直接中斷程式不是指程式寫中斷程式的敘述,而是...
06/16 03:19, 10F

06/16 03:20, , 11F
系統無法提供記憶體,於是強制中斷程式.
06/16 03:20, 11F

06/16 03:21, , 12F
我說的方法是:為了避免強制中斷,自己程式先確認可用的記憶體
06/16 03:21, 12F

06/16 03:52, , 13F
您是指 windows 會直接自動把程式關掉?這就真的無解了 ...
06/16 03:52, 13F

06/16 04:00, , 14F
另外可以請問有簡單的 function 可以確認還有多少記憶體嗎?
06/16 04:00, 14F

06/16 04:11, , 15F
好像找到了,看來 GlobalMemoryStatusEx 似乎可以看到的樣子
06/16 04:11, 15F

06/16 09:44, , 16F
每個process的heap區會有一個限制!?new會吃heap區~~
06/16 09:44, 16F

06/16 11:23, , 17F
是啊,每個process可以挖的記憶體有個限制,processes總共的
06/16 11:23, 17F

06/16 11:24, , 18F
記憶體也有個限制. 總數比較簡單,只要衡量實體記憶體可用量
06/16 11:24, 18F

06/16 11:25, , 19F
即可. 每個process的上限多少,我還不知道上哪找資訊.
06/16 11:25, 19F

06/16 15:15, , 20F
msdn
06/16 15:15, 20F

06/16 16:32, , 22F
喔,太感謝你這項資訊了
06/16 16:32, 22F

06/16 19:12, , 23F
unix : getrlimit, setrlimit
06/16 19:12, 23F
文章代碼(AID): #1ADf0dga (C_and_CPP)
文章代碼(AID): #1ADf0dga (C_and_CPP)