2014-09-26 60 views
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++中斷的文章中。

回答

4

如果構造函數拋出,分配不會發生,所以p具有它以前的任何值。

所以是的,bar保證在你的代碼片段中返回NULL

而這與雙重檢查鎖定無關;這是一個無關的併發問題。

+0

但是在某些情況下允許編譯器重新排序賦值(這就是我提到的雙重檢查鎖定時所指的),所以我正在尋找標準中的措辭,禁止它將p賦值給點到運行構造函數代碼之前分配給新對象的內存。 – Bwmat 2014-09-26 06:23:45

+0

在確定'new Foo()'的值之前,賦值不可能發生。 – fredoverflow 2014-09-26 06:24:49

+0

Fred是正確的,但是,如果你是'偏執狂',你總是可以在'catch'子句中將'p'設置回'NULL' :-) – paxdiablo 2014-09-26 06:27:21

相關問題