C++ Destruir objetos de un arreglo

publicado por: Anonymous

Hola tengo un par de dudas

Digamos que tengo este codigo:

class alumno
{
    private:
        string nombres;
        char telefono[12];
        int nivel;
    public:
        alumno();
        ~alumno();
}

y despues en el main declaro

alumno estudiante[10];

Mis dudas son:

  • Como llamo el destructor para un solo objeto?
  • Como destruyo todo el arreglo?
  • Si borro un objeto los datos quedan en blanco? o desaparece la
    casilla del objeto? (osea si el tamaño del arreglo es 10, bajara a 9?)

solución

1. Como llamo el destructor para un solo objeto?

Dentro de un arreglo, puedes hacer estudiante[3].~alumno( );

2. Como destruyo todo el arreglo?

Tal y como lo has declarado, el arreglo se destruye al salir de la función, de forma automática. Antes de dicha destrucción, se invocan, uno a uno, los destructores de los objetos contenidos en el arreglo.

Si quieres poder destruirlo cuando te plazca, has de usar memoria dinámica:

alumno *estudiante = new alumno[10];
...
delete[] alumno;

Si usas esta última fórmula, arreglos dinámicos, recuerda que es tu responsabilidad el destruirlos haciendo el delete[]. El compilador se desentiende totalmente de ellos. Es decir, no son destruidos ni liberados al salir de la función.

3. Si borro un objeto los datos quedan en blanco? o desaparece la casilla del objeto? (osea si el tamaño del arreglo es 10, bajara a 9?)

Si las instancias están dentro de un arreglo, ni el arreglo ni los datos cambian. Todo queda tal y como esté cuando finalice el destructor de la clase implicada.

Si el destructor no hace nada, la memória queda tal y como estuviera. Desde luego, el número de elementos del arreglo no cambia.

Piensa que, desde el punto de vista del compilador, un arreglo no es mas que un bloque de memoria. Una vez asignado, no cambia de tamaño (salvo que lo cambiemos nosotros explicitamente).

Cuidado con lo que haces. Por lógica, si primero llamas al destructor de un objeto, y luego haces el delete del arreglo completo, el destructor volverá a ser llamado. Es cosa tuya el comprobar la lógica de tu programa.

Respondido por: user23371

Leave a Reply

Your email address will not be published. Required fields are marked *