假定以下代碼:將使用從構造函數中拋出的新(std :: nothrow)掩碼異常嗎?
Foo* p = new (std::nothrow) Foo();
「P」將等於0,如果我們出堆內存。
如果我們是不是會發生什麼情況但Foo的構造函數會拋出?這個異常是否會被'new'和'p'的nothrow版本設置爲0所「掩蓋」......或者,從Foo的構造函數拋出的異常是否會使其不在函數中?
假定以下代碼:將使用從構造函數中拋出的新(std :: nothrow)掩碼異常嗎?
Foo* p = new (std::nothrow) Foo();
「P」將等於0,如果我們出堆內存。
如果我們是不是會發生什麼情況但Foo的構造函數會拋出?這個異常是否會被'new'和'p'的nothrow版本設置爲0所「掩蓋」......或者,從Foo的構造函數拋出的異常是否會使其不在函數中?
不,它不會。 nothrow
僅適用於對new
的調用,而不適用於構造函數。
Foo
的構造函數仍然可以拋出異常,它們將會通過。
構造函數直到分配內存後才被調用。
我剛試過。例外通過。如果您運行下面的代碼:
#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
因此,除了確實儘管拋出異常的打通。