2012-12-10 48 views
0

當我編碼如下,它會返回'空',並沒有發生異常。C++:內存不足時會返回什麼?

Char* pStr = new(std::nothrow)Char(10); 

對新操作符不使用'nothrow'參數怎麼辦? 它也返回'null'嗎?如果是這樣,爲什麼建議使用'nothrow'參數?

Char* pStr = new Char(10); 

感謝您的時間。

+0

['std :: bad_alloc'](http://stackoverflow.com/questions/7749066/how-to-catch-out-of-memory-exception-in-c) –

+3

誰推薦使用'nothrow'? http://www.gotw.ca/publications/mill16.htm避免使用nothrow。 – user93353

+1

推薦使用無投擲版本的地方在哪裏? –

回答

5

new如果失敗,將拋出異常,除非您指定nothrow,在這種情況下,如果失敗,將返回nullptr。至於爲什麼要使用nothrow:在某些系統上,異常不被支持(或者被嚴重支持)(這在遊戲控制檯上可能尤其如此)。所以最好甚至不要使用它們。這僅僅是可以使用nothrow時的一個例子。

+0

這條線'所以最好不要使用它們。'會給人錯誤的印象。也許你的意思是「所以最好在這些系統中根本不使用它們,在這些系統中,不支持或不支持異常的地方繼續前面的句子。 – user93353

+0

使用'nothrow'的主要原因是因爲你想立即在本地處理錯誤。一個典型的例子可能在編輯器中,如果分配失敗,將會溢出到磁盤(釋放更多的內存)。 –

+0

@ user93353:是的,這就是我想要的那個句子(我的意思是在上一句話中)。如果它另有說明,那麼謝謝澄清。 – Cornstalks

2

怎麼樣在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版本。其中一些情況如下:

  • 您正在使用舊版C++編譯器(在語言標準化之前發佈),它們不支持異常。
  • 明確禁用例外的目標平臺(例如:嵌入式系統)或不能保證正常工作。
  • 如果您正在處理大量依賴此行爲的遺留代碼,則1990年代的標準行爲new將返回NULL
-1

new不能分配內存,它拋出一個異常bad_alloc這將使你的程序在一個不尋常的方式崩潰,如果該異常不能handled.If我們要避免這種情況,我們可以使用nothrow這是重載函數new的參數或可以捕獲異常。 nothrow將在內存不足時返回null,程序員可以決定在這一點上做什麼。

+1

*「無法分配內存的'new'只會終止異常'bad_alloc',這使得我們的程序以不尋常的方式崩潰」*,不正確。如果您正確捕獲異常,您的程序不會崩潰。沒有什麼不尋常的,它是明確定義的行爲。如果你使用任何可能拋出異常的函數/運算符,那麼你應該捕獲它們應該拋出的異常。 –

+0

但是如果沒有處理異常,它會崩潰。如果沒有異常處理,我已經說過了。 「內存簡單地終止於異常bad_alloc」這清楚地表明,有一個必須處理的異常,否則程序將崩潰。 –

+0

我很抱歉,但我真的不能看到*「內存簡單地終止於異常bad_alloc」*意味着*「有一個必須處理的異常,否則程序將崩潰」*。兩者幾乎都是正交的。 –