2011-01-15 40 views

Respuesta

12

Esto es, en gran parte, por coherencia. Cuando se crean múltiples objetos en secuencia, siempre se destruyen en el orden inverso. Por ejemplo, consideremos el siguiente ejemplo con variables automáticas:

{ 
    A a; 
    B b(a); 
} // b.~B() is called, then 
    // a.~A() is called 

Aquí, b utiliza a. Al garantizar que los objetos se destruyan en el orden inverso de su construcción, C++ hace que la administración de la vida útil de los objetos sea mucho más fácil.

En una clase, puede pasar una referencia a un miembro de datos al inicializar otro miembro de datos. Asegurar que los objetos se destruyen en orden inverso, se obtiene el mismo comportamiento que con las variables automáticas:

struct S 
{ 
    A a; 
    B b; 

    S() : a(), b(a) { } 
}; 

Tenga en cuenta que normalmente no es una buena idea tener miembros de datos que se refieren el uno al otro, pero es posible y útil en ocasiones .

+1

Quizás sea más exacto decirlo que cuando un objeto B aparece después de un objeto A, B puede contener una referencia a A. Lo opuesto no es verdadero, entonces la destrucción en orden inverso (B, luego A) tiene sentido, mientras que destruir A primero podría conducir a errores, ya que B podría contener una referencia a eso. – EmeryBerger

+0

@EmeryBerger Sí, pero solo porque una referencia de miembro directo debe inicializarse en la construcción. Pero una referencia no es la única forma de 'referencia': los miembros son libres de mantener punteros entre sí, y estos se pueden establecer en cualquier momento, por lo tanto, son libres de estar fuera de servicio y convertirse en inválidos. Además, los miembros pueden mantener referencias "reales" entre sí fuera de orden si dicha referencia es miembro de un contenedor dinámico como 'std :: vector'. Por lo tanto, no hay realmente ninguna 'lata' o 'no puedo' sobre esto, simplemente _debería_ y _no debería_. Pensar adecuadamente sobre la vida es esencial, independientemente de la forma de referencia –

5

Creo que tal vez ha entendido mal. No es que los miembros se destruyan en este orden, sino que son especificados a.

Puede ser importante en circunstancias excepcionales conocer el orden en que se destruyen los artículos.

En cualquier caso, ese es el orden en que se destruyen los objetos, no hay nada que se pueda hacer al respecto, pero sepa que es lo que está sucediendo.

2

Las duraciones en C++ se anidan tanto como sea posible. Es posible, aunque habitualmente raro, que los miembros de los datos dependan unos de otros directamente (por ejemplo, pasen un puntero de uno a otro) o indirectamente (p. Ej., Ambos dependen de un global, como escribir el resultado en stderr), pero incluso cuando no lo hacen t, es agradable tener un orden específico, y el anidamiento se ajusta mejor a cómo funciona el resto del lenguaje (por ejemplo, vidas en el alcance de la función) que otras ordenaciones.

Por supuesto, siguiendo la regla "como si" en el estándar, si el compilador/implementación puede determinar que el código del usuario no puede observar la destrucción de la reordenación, entonces puede hacer lo que quiera.

Cuestiones relacionadas