¿Nuevo conjunto puntero a NULL si se lanza std::bad_alloc?
-
27-10-2019 - |
Pregunta
Sé que haciendo un new(std::no_throw)
se establece puntero a NULL
si no se pudo.También sé que una normal new
va a lanzar una std::bad_alloc
excepción en caso de que no.
Será el normal new
también se establece el puntero a NULL
si se lanza?O debo configurarlo para que NULL
en el catch()
bloque?
Solución
En C ++, un new
incorrecto arrojará una excepción (a menos que use std :: nothrow) y el puntero no se asignará, por lo que será lo que fuera antes de que se realizara la llamada new
.
Sin embargo, puede estar interesado en este artículo que habla de forzar a new
a devolver un valor nulo en caso de falla como mencionó en su pregunta.
Otros consejos
Cuando se produce una excepción, la pila se desenvuelve (ejecución de los destructores de objetos locales) hasta un catch
detiene la excepción.No hay nada que ajusta automáticamente el puntero a NULL
, y es unilkely que uno de los destructores lo hace - sería un ejemplo inventado que hizo.
Generalmente, no hay necesidad de establecer el puntero a NULL
.De hecho, a menudo no se puede.Usa el siguiente código:
try {
std::string s("hello, world");
} catch (std::bad_alloc) {
// ???
}
Es posible que la asignación de los 12 bytes de falla.La excepción se devuelven desde el constructor de std::string
.En ese momento, el objeto s
ya no existe, ni tampoco el puntero s._SomeInternalName
dentro de s
.El compilador inolvidable para informar de un error si intenta utilizar s
en el bloque catch.Y si el puntero no existe, obviamente, no se puede establecer a 0.