2010-04-09 15 views
8

C++ llama automaticamente destructores de todas las variables locales en el bloque en orden inverso independientemente de si el bloque se sale normalmente (el control no funciona) o si se produce una excepción.¿Cómo se destruyen las variables locales cuando sale un bloque normalmente llamado en C++?

Parece que el término stack unwinding solo se aplica a este último. ¿Cómo se llama el proceso anterior (la salida normal del bloque) para destruir variables locales?

+1

Realmente no se llama nada. En todas partes del estándar, dice cosas como "... las variables automáticas se destruyen al final del bloque". Nunca da un nombre a ese proceso. – GManNickG

+0

@GMan - Guarde los unicornios: supongo que podría agregar esto como respuesta. Mencionar lo que dice el Estándar es un argumento fuerte. – sharptooth

Respuesta

5

Un objeto se destruye automáticamente cuando "se sale del alcance". Esto podría denominarse "recuperación automática de almacenamiento", pero en realidad se refiere a la recolección de basura (hay varios documentos con esa frase en su nombre que usan el término para referirse a la recolección de basura). Cuando se utiliza para asegurar el emparejamiento adecuado de apertura/cierre, bloqueo/desbloqueo u otras formas de adquisición de recursos con su lanzamiento apropiado, entonces se conoce como el patrón de diseño Resource Acquisition is Initialization (RAII), lo cual es algo irónico dado que el aspecto principal de RAII no es la inicialización o adquisición del recurso, sino su destrucción.

2

La variable local se destruye cuando se sale del alcance. Tal vez el proceso se llama como "fuera de alcance"?

1

No estoy seguro de que haya un nombre para esto. Las variables de pila son así que automático que nadie se preocupa por ellas, nunca, ni siquiera lo suficiente como para dar un nombre para este proceso de limpieza automático.

Llámalo "fuera de alcance", supongo.

1

Siempre he escuchado que se habla como "fuera de alcance" o más precisamente "una variable auto saliendo de su alcance".

1

Si lo que estás preguntando es cómo la llamada al método que se implementa en código de máquina, diría que dependerá de la convención de llamada utilicé

3

Pila desenrollar sucede en estos dos casos, es sólo que en condiciones normales ejecución la pila se desenrolla solo en el contexto del método de llamada (o bloque) cuando el método de ejecución vuelve (o se sale del bloque). Las variables locales se asignan en la pila, por lo que se limpian en el orden inverso de la asignación, y este proceso se denomina desenrollamiento. No es diferente de procesar cualquier otro tipo de datos que almacene en una estructura LIFO, p. deshacer rehacer.

Cuando se lanza una excepción, el controlador desenrollará la pila mediante cero o más métodos hasta que encuentre una que pueda capturar la excepción, o hasta que llegue a la parte superior de la pila, momento en el que el manejador de excepción no controlada será llamado.

Parece ser convencional usar solo el término desenrollado de pila en el caso de manejo de excepciones, pero es el mismo proceso que ocurre en cada uno de estos casos. El caso específico en el que la pila se desenrolla debido a que un método sale se llama return, no parece haber ninguna convención para nombrar lo que sucede cuando se sale de un bloque de código delimitado.

Cuestiones relacionadas