Goto out of a block: do destructors get called?
Considere el siguiente código:
void foo()
{
{
CSomeClass bar;
// Some code here...
goto label;
// and here...
}
label:
// and here...
}
¿Se llamará el destructor de bar ?
4 answers
El estándar de C++ dice:
Al salir de un ámbito (sin embargo ), los destructores (12.4) son llamado para todos los objetos construidos con duración de almacenamiento automática (3.7.2) (objetos nombrados o temporales) que se declaran en dicho ámbito, en el orden inverso de su declaración.
Así que la respuesta es "sí".
Sí, serán llamados.
Actualización: (está bien hacer esto, gotos no es peor que lanzar excepciones ficticias o usar bools/ifs para salir de las cosas. Un simple goto dentro de una función no lo convierte en código espagueti.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-05 13:45:24
1) Sí. 2) No hagas esto.
Elaboración: conceptualmente, esto no es diferente de dejar un bucle a través de un break
. goto
, sin embargo, está fuertemente, fuertemente desaconsejado. Casi nunca es necesario usar goto
, y cualquier uso debe ser examinado para averiguar qué está pasando.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-05 13:44:48
Sí, como todos los demás dicen. C++ especifica / ordena esto.
Pero solo para agregar a eso, para completar: si su goto
utiliza la extensión computed-goto
que se encuentra en algunos compiladores g gcc, clang, posiblemente otros pero no incluyendo MSVC last I knew whether si se llamará o no al destructor del objeto es bastante confuso. Cuando un goto
va a una sola ubicación, es muy claro qué destructores deben ser llamados antes de la transferencia de control-flujo. Pero con un goto
, diferentes destructores podrían necesitar ser llamados dinámicamente, para dar la semántica "esperada". No estoy seguro de lo que hacen los compiladores que implementan esta extensión, en esos casos. Mi recuerdo de encontrar esto es que clang advierte cuando un computed - goto
podría dejar un alcance con un objeto con un destructor no trival, alegando que el destructor no será llamado. En algunos casos podría estar bien, en otros no. No se lo que hacen otros compiladores. Solo tenga en cuenta el problema si desea usar calculados goto
en concierto con objetos con destructores no triviales.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-10 17:14:55