Veo en algún libro que el orden de destrucción de los miembros de datos en clase debe ser en el orden inverso de su orden de construcción. ¿Cuál es el motivo de esta regla? Cualquier ejemplo es apreciado.¿Por qué es importante el orden de destrucción para los miembros de los datos?
Respuesta
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 .
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
@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 –
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.
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.
- 1. ¿Por qué el orden de las declaraciones es importante para los inicializadores estáticos?
- 2. ¿Es importante el orden de los bloqueos de captura?
- 3. ¿por qué la alineación de la estructura de datos es importante para el rendimiento?
- 4. ¿Por qué se agrega el relleno para los miembros de datos múltiples de estructuras y no para miembros individuales?
- 5. ¿Por qué es importante JSON?
- 6. ¿Es importante el orden de las características en los vectores de características de LibSVM?
- 7. ¿Qué es la asociatividad de los operadores y por qué es importante?
- 8. ¿Por qué Hash.new ({}) oculta los miembros hash?
- 9. ¿Por qué el tamaño de clase depende solo de los miembros de datos y no de las funciones de miembros?
- 10. ¿Cuán importante es el orden de las columnas en los índices?
- 11. ¿Es importante el orden de la tabla virtual?
- 12. ¿Cambia el orden de los miembros de datos privados de clase ABI
- 13. ¿Qué es WebIDL y (por qué) es importante?
- 14. XML, DTD: cómo hacer que el orden no es importante
- 15. ¿Por qué es importante el manejo de errores?
- 16. Polimorfismo en tiempo de compilación para los miembros de datos
- 17. Qué tan importante es la alineación en los datos de vértices abiertos en iOS
- 18. ¿El orden del predicado es importante cuando se usa LINQ?
- 19. ¿Pueden los miembros de salida de Doxygen purificarse por orden de declaración?
- 20. Orden de destrucción para la matriz de objetos
- 21. C++: orden de inicialización de los miembros de datos de clase
- 22. ¿Por qué en C# el pedido es importante para la inicialización estática?
- 23. G ++ obtiene el orden de destrucción de variables estáticas incorrecto
- 24. Orden de campos miembros en Enum
- 25. ¿Qué AttributeTarget debería usar para los miembros de enum?
- 26. Microsoft Certified Partner? Importante para los desarrolladores?
- 27. ¿Se puede garantizar el orden de destrucción cuando los objetos se declaran en una pila?
- 28. ¿Por qué son necesarios los archivos javascript predeterminados para crear un enlace de destrucción en los rieles?
- 29. ¿Para qué sirven los miembros de inyección en RegisterType()?
- 30. ¿Para qué sirven los indicadores para los miembros de la clase?
No creo que esta sea una práctica recomendada, sino una simple declaración de hechos: http://www.parashift.com/c++faq-lite/dtors.html#faq-11.2 – mkb