2010-08-02 86 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