2010-08-02 18 views
7

Duplicar posibles:
Will new return NULL in any case?¿El nuevo operador devolverá NULL?

decir que tengo un coche de clase y puedo crear un objeto

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

Duplicado de [¿Volverá a ser NULL en cualquier caso?] (Http://stackoverflow.com/questions/550451/will-new-return-null-in-any-case) –

Respuesta

28

En una implementación de normas conformes C++, no. La forma ordinaria de new nunca devolverá NULL; si falla la asignación, se lanzará una excepción std::bad_alloc (el formulario new (nothrow) no arroja excepciones, y devolverá NULL si falla la asignación).

En algunos compiladores de C++ de más edad (especialmente los que se publicaron antes se estandarizó el idioma), o en situaciones en las excepciones están desactivadas de manera explícita (por ejemplo, tal vez algunos compiladores para sistemas empotrados), new puede volver NULL en caso de fallo. Los compiladores que hacen esto no se ajustan al estándar C++.

+0

¡Exactamente! La forma de hacerlo en C++ es con try/catch blocks. Aquí hay un ejemplo: http://www.cplusplus.com/reference/std/new/bad_alloc/ – karlphillip

2

De forma predeterminada, C++ arroja una excepción std :: bad_alloc cuando falla el nuevo operador. Por lo tanto, la verificación de NULL no es necesaria a menos que se desactive explícitamente el uso de excepciones.

+0

... y si deshabilita el uso de excepciones, entonces el lenguaje ya no es C++. –

8

No, new arroja std::bad_alloc en la falla de asignación. Use new(std::nothrow) Car en su lugar si no desea excepciones.

1

Lo he visto muchas veces y me he preguntado por qué como nuevo se lanzará una excepción de memoria. Supongo que proviene de desarrolladores que solían trabajar en C y ahora son C++.

+0

¿A qué te refieres? No arrojó una excepción en C, y no estoy seguro de qué comportamiento pienses que es sensato si ninguno de esos. – Chuck

+4

"Comprobando nulo", creo que quiere decir. –

+0

"verificando nulo" reflejo de mordaza generalizada fue sin duda la razón por la cual un programador de VC6 que implementó 'new' en el momento, decidió devolver NULL fue una decisión sensata. tal vez Malloc hizo eso y dado que lo nuevo simplemente se queda malloc ... –

Cuestiones relacionadas