通用new記憶體分配失敗都要拋例外,如何讓他不拋例外,根據回傳值來判斷
uj5u.com熱心網友回復:
通過try...catch()試試uj5u.com熱心網友回復:
new(std::nothrow)uj5u.com熱心網友回復:
都讓不拋例外了,捕獲有意義???
你試了沒有啊,那么多花不是白掛的吧???
uj5u.com熱心網友回復:
http://blog.csdn.net/jia_xiaoxin/article/details/3347904看下這個,希望對你有所幫助~
uj5u.com熱心網友回復:
首先是要判斷你拋出例外的原因,是因為記憶體不夠?還是因為別的uj5u.com熱心網友回復:
看清問題好嗎?
uj5u.com熱心網友回復:
你說的就不清楚,上代碼吧
uj5u.com熱心網友回復:
首先是要判斷你拋出例外的原因,是因為記憶體不夠?還是因為別的
看清問題好嗎?
你說的就不清楚,上代碼吧
就是MFC下,我不想讓TRY CATCH來包圍 new ,,,我要new不拋例外,把結果回傳,讓我知道它出錯了就行了,其它的我自已在new外面進行處理,怎么實作
uj5u.com熱心網友回復:
簡單的判斷是否為NULL就可以了uj5u.com熱心網友回復:
簡單的判斷是否為NULL就可以了
前提得是讓NEW失敗時不讓它拋例外,然后才能這樣判斷是否為NULL灑,,否則還沒等你判斷,例外先出來,程式不就掛了么,這樣做是徒勞,,,,剛才我試了,就是這樣的
其實關鍵是生成MFC的類物件時處理不了,其它情況都可以,,,難道NEW一個MFC的類物件,非要用TRY CATCH,,
uj5u.com熱心網友回復:
簡單的判斷是否為NULL就可以了
前提得是讓NEW失敗時不讓它拋例外,然后才能這樣判斷是否為NULL灑,,否則還沒等你判斷,例外先出來,程式不就掛了么,這樣做是徒勞,,,,剛才我試了,就是這樣的
其實關鍵是生成MFC的類物件時處理不了,其它情況都可以,,,難道NEW一個MFC的類物件,非要用TRY CATCH,,
所以我讓你上代碼
uj5u.com熱心網友回復:
new 大致兩個操作,一個是開一片記憶體,再呼叫建構式,這兩個一般來說不應該出現例外,(除非記憶體不夠)。uj5u.com熱心網友回復:
new 大致兩個操作,一個是開一片記憶體,再呼叫建構式,這兩個一般來說不應該出現例外,(除非記憶體不夠)。
再跟你解釋就沒意思了,,什么叫不應該出現例外,是個程式員都知道的科譜你還要在這重復,不累嗎,
我現在就是要解決"這萬一出了例外的情況"的代碼,明白嗎?,,你還要我上代碼,,,無語。。。
uj5u.com熱心網友回復:
就是MFC下,我不想讓TRY CATCH來包圍 new ,,,我要new不拋例外,把結果回傳,讓我知道它出錯了就行了,其它的我自已在new外面進行處理,怎么實作
那沒法實作。new有問題,得new多大的資料區啊
uj5u.com熱心網友回復:
new 大致兩個操作,一個是開一片記憶體,再呼叫建構式,這兩個一般來說不應該出現例外,(除非記憶體不夠)。
再跟你解釋就沒意思了,,什么叫不應該出現例外,是個程式員都知道的科譜你還要在這重復,不累嗎,
我現在就是要解決"這萬一出了例外的情況"的代碼,明白嗎?,,你還要我上代碼,,,無語。。。
你這樣說話,就像一個病人,對醫生說“我有病”,醫生問你哪難受,你只會回答“我有病”
uj5u.com熱心網友回復:
new第一作用是分配記憶體,第二是在分配的記憶體上呼叫建構式,因此new產生的例外不外符是記憶體不夠和建構式里面的陳述句排除記憶體不夠的問題,就只能是你new的物件建構式里面有一些操作的問題。
你應該找為什么new失敗
uj5u.com熱心網友回復:
http://technet.microsoft.com/zh-cn/aa298584uj5u.com熱心網友回復:
new第一作用是分配記憶體,第二是在分配的記憶體上呼叫建構式,因此new產生的例外不外符是記憶體不夠和建構式里面的陳述句
排除記憶體不夠的問題,就只能是你new的物件建構式里面有一些操作的問題。
你應該找為什么new失敗
你自已都把兩種情況列出來,卻對第一種情況熟視無睹,而我要解決的就是第一種情況,至于第二種情況,我已經給你們提醒的夠多的了--------我是要在MFC下啊,,其實用SET_NEW_HANDLE是一個方法,不過我嫌那個麻煩
uj5u.com熱心網友回復:
try{}
catch(std::bad_alloc& e)
{}
用bad_alloc來catch就能回傳。
uj5u.com熱心網友回復:
new第一作用是分配記憶體,第二是在分配的記憶體上呼叫建構式,因此new產生的例外不外符是記憶體不夠和建構式里面的陳述句
排除記憶體不夠的問題,就只能是你new的物件建構式里面有一些操作的問題。
你應該找為什么new失敗
你自已都把兩種情況列出來,卻對第一種情況熟視無睹,而我要解決的就是第一種情況,至于第二種情況,我已經給你們提醒的夠多的了--------我是要在MFC下啊,,其實用SET_NEW_HANDLE是一個方法,不過我嫌那個麻煩
自己提問還那么拽,你那么拽,你別提問啊,人家幫你想辦法還這還那的。
一般而言 new出問題的時候 未必是new的問題 而是其他地方出錯了
個人覺得 new這種地方出問題 通常是你的代碼不夠穩健
uj5u.com熱心網友回復:
樓主 真是讓人討厭我來灌水混分的 扯
uj5u.com熱心網友回復:
2樓正解,可以結貼了uj5u.com熱心網友回復:
2樓正解,可以結貼了
正解個蛋,沒玩過MFC是吧,,,你用那種方式new一個MFC物件編譯能過嗎??知道為什么嗎???
uj5u.com熱心網友回復:
樓主,我看你先用程式獲取當前電腦剩余記憶體,然后用sizeof(類物件)得到需要的記憶體大小,經過比較,判斷是否可以new。如果可以,就new;如果不行,就回傳uj5u.com熱心網友回復:
https://blog.csdn.net/syqx3344/article/details/17758689uj5u.com熱心網友回復:
例子:
#ifndef _DEBUG
#include <new>
#endif
BOOL CCRainDlgDlg::OnInitDialog()
{
#ifdef _DEBUG
CString *pstr=new(CString);
#else
CString *pstr=new(std::nothrow)CString;
#endif
*pstr="std::nothrow";
AfxMessageBox(*pstr);
uj5u.com熱心網友回復:
可以試試谷歌的tcmalloc來分配記憶體,這里有張圖來說明tcmalloc如果分配失敗會自動怎么辦
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/67055.html
標籤:基礎類
