2016-02-27 24 views
2

我正在學習新的和刪除,我不真正瞭解下面的代碼中的nothrow部分。
新(std :: nothrow),而不是新的和錯誤處理

我知道std::nothrow是通知編譯器不要拋出異常,但有沒有另一個原因要寫std::nothrow

我不完全理解的代碼是:

// Is there another reason to write: 
T *p = new(nothrow) T; 
// instead of this: 
T *p = new T; 

,如何應對這兩種情況下的錯誤?

+5

是不是回答你的問題正確的,在這個問題嗎? – Brian

+1

你的代碼中的註釋似乎表明你認爲兩者是相同的;他們不是。 – GManNickG

+0

究竟有什麼研究出現了'nothrow'?說真的,你考慮過在網上搜索嗎? –

回答

7

關鍵字new分配空間創建對象和分配的空間返回一個指向新的對象。

T *p = new T;而不nothrow因爲如果new失敗它拋出std::bad_alloc或(因爲C++ 11)上未能分配內存從std::bad_alloc衍生另一個異常最好用例外錯誤報告使用。

例子:

T *p; 
try { 
    p = new T; 
} 
catch(const std::bad_alloc &e) { 
    std::cout << "Error: " << e.what() << '\n'; 
} 

如果你不使用異常錯誤報告,那麼你應該使用nothrow選項。

否則,當或如果新失敗,它將拋出一個異常。隨着nothrow選項,而不是,它會返回一個空指針,然後我們可以測試空指針這樣的:

T *p = new(std::nothrow) T; 
if (p == nullptr) { 
    std::cout << "new T failed\n"; 
    return 1; 
} 
2

讀標準nothrow,它聲稱:

的std ::拋出異常是類型爲std恆定:: nothrow_t用來消除投擲和非投擲分配函數的重載。

所以,是的,從本質上講,這是編譯器知道要調用的分配功能的標誌,那就是它的唯一標準化的功能。

相關問題