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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top