2
我不知道如何解釋這個問題,以便谷歌可以幫助我。如果Foo的構造函數拋出,'Foo * p = new Foo()'中p的值是什麼?
一位同事這樣今天早些時候問我(換句話說):
考慮下面的代碼:
struct Foo
{
Foo() {throw 1;}
}
Foo* bar()
{
Foo *p = NULL;
try
{
p = new Foo();
}
catch (...) {}
return p;
}
根據C++標準,是吧()保證返回NULL,或者是行爲實現定義?我猜這是後者,從我讀過的有關雙重檢查鎖定習慣用C++中斷的文章中。
但是在某些情況下允許編譯器重新排序賦值(這就是我提到的雙重檢查鎖定時所指的),所以我正在尋找標準中的措辭,禁止它將p賦值給點到運行構造函數代碼之前分配給新對象的內存。 – Bwmat 2014-09-26 06:23:45
在確定'new Foo()'的值之前,賦值不可能發生。 – fredoverflow 2014-09-26 06:24:49
Fred是正確的,但是,如果你是'偏執狂',你總是可以在'catch'子句中將'p'設置回'NULL' :-) – paxdiablo 2014-09-26 06:27:21