我知道這樣一個new(std::no_throw)
將設置指針NULL
,如果它失敗了。 我也知道,一個正常new
將拋出一個異常std::bad_alloc
如果它失敗了。如果它引發std :: bad_alloc,是否將新的指針設置爲NULL?
將正常new
指針也設置爲NULL
如果它拋出?或者我應該將它設置爲catch()
塊中的NULL
?
我知道這樣一個new(std::no_throw)
將設置指針NULL
,如果它失敗了。 我也知道,一個正常new
將拋出一個異常std::bad_alloc
如果它失敗了。如果它引發std :: bad_alloc,是否將新的指針設置爲NULL?
將正常new
指針也設置爲NULL
如果它拋出?或者我應該將它設置爲catch()
塊中的NULL
?
C++中的壞new
將拋出一個異常(除非你使用std ::拋出異常),指針不會被分配,這樣它會不管它是被做了new
調用之前。
但是,您可能會對this article感興趣,其中談到強制new
如您在問題中提到的那樣在失敗時返回null。
當一個異常被拋出,疊層被展開(運行本地對象的析構函數),直到停止catch
除外。沒有任何東西會自動將指針設置爲NULL
,並且其中一個析構函數可以這麼做 - 這可能是一個人爲的例子。
通常情況下,沒有必要將指針設置爲NULL
。事實上,你通常不能。看看下面的代碼:
try {
std::string s("hello, world");
} catch (std::bad_alloc) {
// ???
}
這有可能是這12個字節的分配失敗。異常將從std::string
的構造函數返回。在這一點上,對象s
已不存在,也沒有指針s._SomeInternalName
內s
。如果您嘗試在catch塊中使用s
,編譯器會報告錯誤。如果指針不存在了,你顯然不能將它設置爲0.