una resolucion programacion orientada operador objetos miembros metodos ejemplos codigo clases clase ambito c++ c++11 language-lawyer c++14 object-lifetime

c++ - resolucion - miembros de una clase en programacion orientada a objetos



¿Qué significa que exista un objeto en C++? (1)

[class.dtor] / 15 lecturas, énfasis mío:

Una vez que se invoca un destructor para un objeto, el objeto ya no existe ; el comportamiento no está definido si se invoca el destructor para un objeto cuyo tiempo de vida ha finalizado (3.8).

Sin embargo, por lo que puedo decir, esta es la única referencia en el estándar a un objeto "existente". Esto también parece contrastar con [basic.life], que es más específico:

La vida útil de un objeto de tipo T finaliza cuando:

  • si T es un tipo de clase con un destructor no trivial (12.4), se inicia la llamada del destructor, o

  • El almacenamiento que ocupa el objeto se reutiliza o libera.

Aquí tenemos dos expresiones diferentes: "la vida útil de un objeto termina" y "el objeto ya no existe", el primero solo ocurre con un destructor no trivial y el último ocurre con cualquier destructor. ¿Cuál es el significado de la diferencia? ¿Cuál es la implicación de un objeto que ya no existe?


La redacción citada parecería implicar que un compilador podría insertar correctamente el código que devuelve la memoria asociada con un objeto al montón al principio de su destructor. Pero hacerlo eliminaría la capacidad de un objeto para hacer referencia a sus propios miembros durante la destrucción, lo que se requiere para que un objeto pueda destruirse a sí mismo.

Así que creo que la redacción citada está rota y debe ser corregida.

Con respecto a lo que significa "vida" y "existencia", propongo que hay algunos contextos diferentes, en los cuales significan cosas diferentes:

En el contexto de la construcción, la vida y la existencia comienzan cuando comienza un constructor. Fuera de ese contexto, comienzan cuando un constructor termina.

En el contexto de la destrucción, la vida y la existencia terminan cuando un destructor termina. Fuera de ese contexto, terminan cuando comienza la destrucción.

Por lo tanto, un objeto puede referirse a sus propios miembros durante la construcción, y potencialmente pasar a funciones de otros objetos, que pueden referirse al objeto y sus miembros, y así sucesivamente. Pero en general, los objetos (instancias de clases) no pueden ser referenciados (sin producir un comportamiento indefinido) hasta después de que uno de sus constructores haya terminado.

Y el destructor de un objeto puede referirse a sus propios miembros y llamar a funciones de otros objetos (existentes), lo que puede referirse a la destrucción del objeto y / o sus miembros. Pero en general, un objeto no puede ser referenciado después de que su destructor haya comenzado.

Este tipo de definición multi-contextual es lo que tiene más sentido para mí, pero puedo ver que se argumentan que un objeto debe considerarse vivo desde el momento en que se asigna la memoria hasta el momento en que se libera la memoria, y diría que la memoria para una copia superficial debe asignarse para un objeto cuando se inicia uno de sus constructores, y se libera cuando termina su destructor.