2011-06-12 20 views
7

Al escribir C++, supongamos que la siguiente línea de código:NULL en instanciación

Object* obj = new Object(); 

Si esta línea tanto compila y no causa excepciones o cualquier otro problemas de tiempo de ejecución visibles, puede ser obj derecho NULL después de este línea fue ejecutada?

Respuesta

14

No, no puede ser objNULL.

Si new falla, lanzará una excepción std::bad_alloc. Si no se lanzó ninguna excepción, se garantiza que obj apunta a una instancia completamente inicializada de Object.

Hay una variante de new que no lanza una excepción

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

En este caso, habrá objNULL si new falla, y el std::bad_alloc excepción no será lanzado (aunque constructor Object 's obviamente todavía puede arrojar excepciones).

En algunos compiladores anteriores, new podría no arrojar una excepción y, en su lugar, devolver NULL, pero este comportamiento no es compatible con los estándares.

Si ha sobrecargado operator new, podría comportarse de manera diferente según su implementación.

+0

O a menos que hayas hecho algo como '#define new new (nothrow)' ¿quizás? ;) –

+0

@Karl Knechtel: Es un comportamiento indefinido – Puppy

+0

¿Qué sucede cuando se compila sin excepciones? ¿Utilizará la versión de nothrow automáticamente? –

2

No, a menos que haya deshabilitado excepciones o haya sobrecargado std::new para hacer algo distinto al estándar (que arroja std::bad_alloc en caso de error).

(no estoy seguro de cómo se comporta cuando std::new excepciones están desactivados, pero una discusión sobre esto está disponible here ...)

+1

El estándar no define cómo se comporta nuevas excepciones cuando están desactivados, ya que la norma no define un mundo en el que las excepciones pueden ser desactivados. Depende de cada implementación de compilador individual. –

4

No, su línea exacta no puede comportarse así. obj siempre apuntará a la memoria válida si no se lanzan excepciones. La siguiente línea, sin embargo, volverá 0 si la memoria no se ha podido asignar:

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

new tiros std::bad_alloc es la asignación no fue exitoso. Entonces deberías atrapar esa excepción.
que puedes usar nothrow nuevo si quieres ser la comprobación de NULL después new.