2009-12-09 62 views
10

假定以下代碼:將使用從構造函數中拋出的新(std :: nothrow)掩碼異常嗎?

Foo* p = new (std::nothrow) Foo(); 

「P」將等於0,如果我們出堆內存。

如果我們是不是會發生什麼情況但Foo的構造函數會拋出?這個異常是否會被'new'和'p'的nothrow版本設置爲0所「掩蓋」......或者,從Foo的構造函數拋出的異常是否會使其不在函數中?

回答

16

不,它不會。 nothrow僅適用於對new的調用,而不適用於構造函數。

12

Foo的構造函數仍然可以拋出異常,它們將會通過。

構造函數直到分配內存後才被調用。

6

我剛試過。例外通過。如果您運行下面的代碼:

#include <new> 

class Foo 
{ 
public: 
    Foo() 
    { 
     throw 42; 
    } 
}; 


int main() 
{ 
    Foo* foo = new(std::nothrow) Foo; 

    return 0; 
} 

,那麼你得到下面的輸出(在Linux反正):

terminate called after throwing an instance of 'int' 
Aborted 

因此,除了確實儘管拋出異常的打通。

相關問題