2011-06-12 40 views
7

當寫C++,假設下面的代碼行:NULL的實例

Object* obj = new Object(); 

如果這條線都編譯,不會造成異常或任何其他可見 運行時的問題,可以OBJ是在此之後空權行被執行?

回答

14

沒有,obj不能NULL

如果new失敗,則會拋出std::bad_alloc異常。如果沒有拋出異常,則obj保證指向Object的完全初始化實例。

有不拋出異常

Object *obj = new(nothrow) Object(); 

在這種情況下new變體,objNULL如果new失敗,並且std::bad_alloc異常不會被拋出(雖然Object的構造顯然仍然會拋出異常)。

在一些較早的編譯器上,new可能不會拋出異常,而是返回NULL,但這不符合標準兼容行爲。

如果你已經超載operator new,它可能會有不同的行爲取決於你的實現。

+0

或者除非你已經做了'#define new new(nothrow)'或許? ;) – 2011-06-12 09:59:03

+0

@Karl Knechtel:這是未定義的行爲 – Puppy 2011-06-12 10:52:30

+0

當你沒有例外編譯時會發生什麼?它會自動使用nothrow版本嗎? – 2011-06-12 11:20:26

2

否,除非您禁用例外或超載std::new以執行非標準操作(拋出故障時拋出std::bad_alloc)。

(我不知道什麼時候例外被中止std::new的行爲,但在這一個討論可here ...)

+1

標準進行檢查NULL沒有定義如何新的行爲異常時,禁用使用,因爲標準沒有規定例外情形可以被禁用的世界。這取決於每個單獨的編譯器實現。 – 2011-06-12 08:01:07

4

不,您的確切線不能表現得那樣。如果沒有拋出異常,obj將始終指向有效的內存。下面這行,不過,將返回0如果內存無法分配:

Object* obj = new (std::nothrow) Object(); 
3

new拋出std::bad_alloc是分配未SUCESSFUL。所以你應該抓住這個例外。
你應該不拋出新的,如果你想後new.