Pregunta

Dos Preguntas 1) ¿Qué sucede cuando una variable/Objeto se lanza a la captura?Digamos, por ejemplo,

int foo() {
   FILE *fp = ....;
   int dummy = 10;
   int *dummy_ptr = new int[10];
   throw 1;
}

int main() {
 try {
   foo();
 } catch (int &i) { 
   std::cout<<"ERROR, the value is "<<i<<std::endl;
 }
}

En esta situación, ¿qué pasa aquí?Una nueva variable creada y, a continuación, pasar???

lo que si puedo usar un puntero o una variable sin referencia

como catch(int *i) // o catch (int i)

También, no todas las variables/recursos declarados o iniciado en el ámbito de aplicación ha sido liberado/cerrado?

2) También en el caso de rethrow, si tengo planes para volver a iniciar con una referencia, la segunda captura, obtiene una nueva variable, si yo me rethrow con sin referencia (i.e) por el valor, entonces los cambios realizados en el intermedio de tiro no se ve afectado....

int goo() {
    throw 2;
}

int foo() {
   try{
      goo();
   } catch(int &i) { // (or) catch(int i) // i is not changing in the next line.
      i = 2;
      throw;
   }
}

int main() {
 try {
   foo();
 } catch (int &i) { 
   std::cout<<"ERROR, the value is "<<i<<std::endl;
 }
}

SALIDA:catch(int &i) // imprime 2 catch(int i) // imprime 1

Desde mi juicio,

Lo que creo es que, como siempre que sea de referencia, el valor se ve afectado, si su paso por valor' en el paso intermedio.todavía se lanza el objeto original a la segunda captura.

(me.e) el flujo de control para la variable no es realmente lanzar el intermedio de captura.....

¿Fue útil?

Solución

Sí, cuando se lanza una excepción, todas las variables automáticas son destruido, en el alcance del lanzamiento y todos los alcances adjuntos hasta se llega al controlador.

Una nota sobre esto, su memoria en dummy_ptr* no se desasignará, y su puntero FILE no se cerrará.

Otros consejos

En esta situación, ¿qué pasa aquí?Una nueva variable creada y, a continuación, pasar?

Sí;cuando se lanza un objeto es creado en algún lugar, y luego destruida una vez que la excepción ha sido manejado (que es, después de salir de la catch bloque sin regeneración).

lo que si puedo usar un puntero o una variable sin referencia?También en el caso de rethrow...

Si la captura de valor, a continuación, obtendrá una copia de ese objeto - si usted rethrow la excepción, a continuación, el siguiente controlador de obtener una nueva copia de la original, y no verás cambios que podría haber hecho.La caza por la referencia que nos dará una referencia para el objeto lanzado - si usted rethrow, entonces el siguiente controlador se ver todos los cambios realizados.Usted no puede coger el objeto puntero - sólo tendrás que coger un puntero si un puntero fue lanzado.

También, no todas las variables declaradas o iniciado en el ámbito de aplicación se ha cerrado?

Cuando se produce una excepción todas las variables automáticas son destruidos, en el ámbito de la throw y adjuntando todos los ámbitos, hasta que el controlador se alcanza.Asignación dinámica de variables (tales como su new int[10]) son no elimina y arbitraria de limpieza funciones como fclose ciertamente no son llamados para FILE* variables, a menos que sean administrados por un ámbito de objetos, tales como un puntero inteligente.

No creo que pueda llamarlo variable;no tiene nombre.Pero un Se crea un nuevo objeto de tipo int, en un lugar no especificado determinado por la implementación.Cuando captas por referencia, la referencia es atado a ese objeto oculto.Y cuando te caes al final de la captura bloquear, o dejar el bloque de captura por cualquier medio que no sea volviendo a lanzar el misma excepción, el objeto es "liberado".

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