2010-08-02 83 views
7

可能重複:
Will new return NULL in any case?新運算符是否返回NULL?

說我有一類車,我創建了一個對象

Car *newcar = new Car(); 
if(newcar==NULL) //is it valid to check for NULL if new runs out of memory 
{ 
} 
+2

重複的[在任何情況下都會返回NULL?](http://stackoverflow.com/questions/550451/will-new-return-null-in-any-case) – 2010-08-02 15:57:37

回答

28

在一個符合標準的C++實現,沒有。 new的普通形式將永不返回NULL;如果分配失敗,將拋出一個std::bad_alloc異常(new (nothrow)表單不會拋出異常,並且如果分配失敗將返回NULL)。

上(即發佈了標準化的語言之前尤其是那些),或者在例外明確禁用(例如,也許一些編譯器的嵌入式系統),new可以在失敗時返回NULL的情況下一些老的C++編譯器。這樣做的編譯器不符合C++標準。

+0

沒錯!在C++中做到這一點的方式是使用try/catch塊。這裏是一個例子:http://www.cplusplus.com/reference/std/new/bad_alloc/ – karlphillip 2010-08-02 16:04:57

2

默認情況下,C++在新操作符失敗時拋出std :: bad_alloc異常。因此,除非明確禁用異常使用,否則不需要檢查NULL。

+0

...如果你禁用異常使用,那麼語言不再是C++。 – 2010-08-02 16:20:12

8

不,new在分配失敗時拋出std::bad_alloc。如果您不需要例外,請使用new(std::nothrow) Car

1

我已經看過很多次了,想知道爲什麼新會拋出一個內存異常。我想它來自曾經在C中工作並且現在是C++的開發人員。

+0

你究竟是什麼意思?它沒有在C中拋出異常,我不確定你認爲哪些行爲是合理的,如果這兩者都不是。 – Chuck 2010-08-02 16:00:05

+4

「檢查爲空」,我認爲他的意思是。 – 2010-08-02 16:03:00

+0

「檢查無效」廣泛的堵嘴反射確實是某些VC6程序員當時實現'new',決定返回NULL是明智的做法。也許malloc做到了,自從新包裝malloc ... – 2015-05-15 05:55:05