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 ?

Author: Alexandre C., 2010-07-05

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í".

 55
Author: ,
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:47:42

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.)

 23
Author: Viktor Sehr,
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.

 8
Author: jwismar,
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.

 4
Author: Jeff Walden,
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