2009-08-07 14 views

Respuesta

36

Sí, lo es. En cualquier ámbito particular, los objetos locales se destruyen en el orden inverso en que se construyeron.

11

Sí, los destructores se llaman en el orden inverso de construcción.

11

Agregando a la respuesta de Neil.

Considere si lo opuesto fue cierto, es decir que no se pudo predecir el orden de los destructores para las variables declaradas de pila. Eso haría casi imposible usar tipos de valores dependientes en la pila. Considere

void Foo() { 
    Type1 t1; 
    Type2 t2(&t1); 
    ... 
} 

Si C++ no garantiza el orden destructor, código recta hacia adelante como esto sería muy peligroso, ya que sería posible que t1 a ser destruido antes de destructor de t2 corrió. Por lo tanto, no puede garantizar que el destructor de t2 se ejecute con un valor t1 válido.

+0

Gran respuesta. Tengo un código que depende del orden de las llamadas al destructor y estaba buscando una razón sólida por la que siempre se ordenaran de una manera particular antes de confiar en que mi código era correcto. –

3

la pregunta era ya respondió, pero me gustaría añadir que normalmente tienen un hábito de escribir algo como esto:

void PerformLogin() 
{ 
    ScopeLock <Lock> LoginLock(&m_LoginLock); 
    doLoginCommand(); 

    { 
     ScopeLock <SharedMemoryBase> MemoryLock(&m_SharedMemory); 
     doStoreLogin(); 
     ... 
    } 
} 

En mi opinión, esto hace más clara la intención (*). Eso podría ser relevante si su código es realmente dependiendo de en el orden específico. Encuentro que esto hace que sea menos probable que alguien accidentalmente cambie el orden y cause un error difícil de encontrar. (Bueno, eso es, por supuesto, no sea un problema, ya que todos tenemos pruebas en el lugar, ¿no?)

siempre escribo el paréntesis redundantes en algo así como   (a && b) || c   también, y creo que este asunto bastante similar.

(*): Por supuesto, también podría usar un comentario.

0

Sí, los destructores son el reverso de los constructores. Debido a que los destructores se usan para eliminar los objetos que ya no son necesarios y el constructor se usa para crear los objetos.

Cuestiones relacionadas