2011-08-14 32 views
11

我已經看到資源顯示了兩種分配內存的方式,同時確保有足夠的內存來完成操作。如何在低內存條件下在C++中正確分配內存

1)換 '新' 操作一個try/catch,因爲它會返回的std :: bad_alloc的(?)

try { ptr = new unsigned char[num_bytes]; } catch(...) {} 

2) '新的' 手術後檢查空分配的指針。

ptr = new unsigned char[num_bytes]; if(ptr == NULL) { ... } 

哪一個是對的?他們都工作嗎?我是否需要做1和2?

感謝,

JBU

回答

16

如果您使用引發異常的標準執行程序new,那麼第一個是正確的。

您還可以使用第二個,如果您使用nothrow爲:

ptr = new (nothrow) unsigned char[num_bytes]; 
if(ptr == NULL) { ... } 
+1

oooh這也許是我應該做的,以減少我需要改變的代碼量。 – jbu

+0

@jbu:還要注意,某些代碼編譯時有例外。這是非標準的,在這種情況下,你需要閱讀你的編譯器文檔,但是如果失敗的話'new'將會返回0。 –

5

一個不成功分配[使用new]拋出std::bad_aloc,所以第一個是正確的。

第二個用於c代碼,當使用malloc [因爲C中沒有例外,NULL用於指示分配失敗]。

當使用new時,if語句永遠不會產生true,因爲如果分配失敗 - 將引發異常,並且if語句將不會被觸發。當然,當分配成功時,if語句將產生錯誤。

+2

一般的好建議,但許多嵌入式C++平臺穿上」 t支持異常,而那些低內存實際上更受關注的是異常。 –

+0

「但許多嵌入式C++平臺不支持異常」:然後它們不支持C++,而是一種類似C++的語言。異常是標準C++的一部分。 – Raedwald

0
try { ptr = new unsigned car[num_bytes]; } 
catch(std::bad_alloc& e) { cerr << "error: " << e.what() << endl; } 

第二個成語是更適合malloc