當我編碼如下,它會返回'空',並沒有發生異常。C++:內存不足時會返回什麼?
Char* pStr = new(std::nothrow)Char(10);
對新操作符不使用'nothrow'參數怎麼辦? 它也返回'null'嗎?如果是這樣,爲什麼建議使用'nothrow'參數?
Char* pStr = new Char(10);
感謝您的時間。
當我編碼如下,它會返回'空',並沒有發生異常。C++:內存不足時會返回什麼?
Char* pStr = new(std::nothrow)Char(10);
對新操作符不使用'nothrow'參數怎麼辦? 它也返回'null'嗎?如果是這樣,爲什麼建議使用'nothrow'參數?
Char* pStr = new Char(10);
感謝您的時間。
new
如果失敗,將拋出異常,除非您指定nothrow
,在這種情況下,如果失敗,將返回nullptr
。至於爲什麼要使用nothrow
:在某些系統上,異常不被支持(或者被嚴重支持)(這在遊戲控制檯上可能尤其如此)。所以最好甚至不要使用它們。這僅僅是可以使用nothrow
時的一個例子。
這條線'所以最好不要使用它們。'會給人錯誤的印象。也許你的意思是「所以最好在這些系統中根本不使用它們,在這些系統中,不支持或不支持異常的地方繼續前面的句子。 – user93353
使用'nothrow'的主要原因是因爲你想立即在本地處理錯誤。一個典型的例子可能在編輯器中,如果分配失敗,將會溢出到磁盤(釋放更多的內存)。 –
@ user93353:是的,這就是我想要的那個句子(我的意思是在上一句話中)。如果它另有說明,那麼謝謝澄清。 – Cornstalks
怎麼樣在
new
運算符上不使用nothrow
參數?它是否也返回null
?
C++標準(§18.4.1.1)定義新算子爲:
void* operator new (std::size_t size) throw (std::bad_alloc);
所以新的這需要一個參數的標準行爲是在故障的情況下拋出std::bad_alloc
。 該標準還定義了一個nothrow
新版本,它有兩個參數:
void* operator new(std::size_t size, const std::nothrow_t&) throw();
這個版本返回在失敗的情況下NULL
,但要注意,你明確地需要一個額外的參數傳遞給新的運營商使用這個版本。
當你應該使用
nothrow
版本?
理想情況下,你應該總是使用標準版的新會拋出一個bad_alloc
。你應該始終堅持這一建議。但是,在某些情況下,您可能會被迫使用nothrow
版本。其中一些情況如下:
new
將返回NULL
。當new
不能分配內存,它拋出一個異常bad_alloc
這將使你的程序在一個不尋常的方式崩潰,如果該異常不能handled.If我們要避免這種情況,我們可以使用nothrow
這是重載函數new
的參數或可以捕獲異常。 nothrow
將在內存不足時返回null
,程序員可以決定在這一點上做什麼。
*「無法分配內存的'new'只會終止異常'bad_alloc',這使得我們的程序以不尋常的方式崩潰」*,不正確。如果您正確捕獲異常,您的程序不會崩潰。沒有什麼不尋常的,它是明確定義的行爲。如果你使用任何可能拋出異常的函數/運算符,那麼你應該捕獲它們應該拋出的異常。 –
但是如果沒有處理異常,它會崩潰。如果沒有異常處理,我已經說過了。 「內存簡單地終止於異常bad_alloc」這清楚地表明,有一個必須處理的異常,否則程序將崩潰。 –
我很抱歉,但我真的不能看到*「內存簡單地終止於異常bad_alloc」*意味着*「有一個必須處理的異常,否則程序將崩潰」*。兩者幾乎都是正交的。 –
['std :: bad_alloc'](http://stackoverflow.com/questions/7749066/how-to-catch-out-of-memory-exception-in-c) –
誰推薦使用'nothrow'? http://www.gotw.ca/publications/mill16.htm避免使用nothrow。 – user93353
推薦使用無投擲版本的地方在哪裏? –