Destructor para matriz dinámica en C++

Namita Chaudhary 12 octubre 2023
  1. Destructor para matriz dinámica en C++
  2. Necesidad de Destructor en C++
  3. Ejemplos de Destructor en C++
  4. Eliminar matriz dinámica usando Destructor en C++
  5. Conclusión
Destructor para matriz dinámica en C++

Mientras programamos en cualquier lenguaje de programación, a menudo escuchamos sobre constructores y destructores. Los constructores son funciones miembro especiales que se utilizan para inicializar el objeto de una clase, mientras que los destructores también son funciones especiales que se llaman automáticamente cuando se va a destruir un objeto.

Este artículo discutirá en detalle el destructor para arreglos dinámicos en C++.

Destructor para matriz dinámica en C++

Los destructores son funciones miembro especiales que tienen el mismo nombre que la clase y se invocan automáticamente cuando se va a destruir un objeto.

La función destructora es la última función que se llama cuando se destruye un objeto. Limpia la memoria que ocupan los objetos creados por el constructor.

Sin embargo, tanto el constructor como el destructor tienen el mismo nombre que el de la clase, pero existe una diferencia entre los dos en cuanto a cómo se escriben para que el compilador pueda diferenciarlos. Los destructores se escriben usando un símbolo de negación (~) seguido del nombre de la clase, y los constructores solo con el nombre de la clase.

Además, solo puede haber un único destructor para una clase, pero los constructores pueden ser múltiples.

Cada vez que se crea un objeto en C++, ocupa memoria en la sección del montón, y usamos la palabra clave nuevo para crear dinámicamente ese objeto de la clase. De manera similar, la palabra clave delete se usa para eliminar el objeto de la clase creado dinámicamente.

Necesidad de Destructor en C++

Necesitamos eliminar el objeto para evitar pérdidas de memoria. Se produce una fuga de memoria cuando los programadores se olvidan de eliminar la memoria del montón que no está en uso. Debido a esto, el rendimiento de la computadora se reduce a medida que se reduce la cantidad de memoria disponible.

Además, si los objetos no se eliminan explícitamente mediante los destructores, el programa se bloqueará durante el tiempo de ejecución.

Ejemplos de Destructor en C++

Ahora, veamos algunos ejemplos de cómo eliminar el objeto de una clase usando el operador delete.

Ejemplo 1:

En el primer ejemplo, crearemos dinámicamente el objeto de una clase usando el operador nuevo y eliminándolo explícitamente usando la palabra clave eliminar en C++.

A continuación se muestra el ejemplo de código que utiliza el operador eliminar en C++.

#include <iostream>
using namespace std;

class Employee {
 public:
  Employee() { cout << "Constructor of Employee class was called!\n"; }
  ~Employee() { cout << "Destructor of Employee class was called!\n"; }
  void work() { cout << "Still Working!\n"; }
};
int main() {
  Employee* emp = new Employee();
  emp->work();
  delete emp;

  return 0;
}

Producción :

Constructor of Employee class was called!
Still Working!
Destructor of Employee class was called!

En el ejemplo anterior, hemos creado una clase Empleado con un constructor, un destructor y una función trabajo que contiene el mensaje apropiado sobre sus acciones.

En la función main, hemos creado el objeto de la clase emp usando la palabra clave new y hemos llamado a la función work() con él. Después de lo cual, solo usamos el operador eliminar y el nombre del objeto emp para eliminar el mismo.

Eliminar matriz dinámica usando Destructor en C++

Hasta ahora, hemos visto cómo eliminar un solo objeto de una clase usando la palabra clave delete en C++. Ahora, veamos cómo eliminar una matriz dinámica o una matriz de objetos en C++.

En este ejemplo, crearemos una matriz dinámica en C++ usando la palabra clave nuevo y luego la eliminaremos usando el operador eliminar.

Sin embargo, una cosa para recordar al eliminar una matriz dinámica en C++ es que debemos usar el operador remove[] para hacerlo y no solo eliminar. Por lo tanto, el operador delete se usa para eliminar un solo objeto de una clase, mientras que para eliminar un arreglo dinámico o un arreglo de objetos, tenemos que usar el operador delete [] en C++.

Ahora, entendámoslo con la ayuda de un ejemplo de código.

#include <iostream>
using namespace std;
class Employee {
 public:
  Employee() { cout << "Constructor of Employee class was called!\n"; }
  ~Employee() { cout << "Destructor of Employee class was called!\n"; }
  void work() { cout << "Still working!\n"; }
};
int main() {
  Employee* emp = new Employee[3];
  emp[0].work();
  emp[1].work();
  emp[2].work();

  delete[] emp;

  return 0;
}

Producción :

Constructor of Employee class was called!
Constructor of Employee class was called!
Constructor of Employee class was called!
Still working!
Still working!
Still working!
Destructor of Employee class was called!
Destructor of Employee class was called!
Destructor of Employee class was called!

En este ejemplo de código, tenemos un código similar al ejemplo anterior, pero esta vez, hemos creado tres objetos Empleado y los hemos eliminado usando el operador remove[] en C++.

Sin embargo, si usamos el operador eliminar en lugar de remove[], el programa falla durante el tiempo de ejecución. Veamos también un ejemplo de eso para comprender más claramente la eliminación de la matriz dinámica en C++.

#include <iostream>
using namespace std;
class Employee {
 public:
  Employee() { cout << "Constructor of Employee class was called!\n"; }
  ~Employee() { cout << "Destructor of Employee class was called!\n"; }
  void work() { cout << "Still working!\n"; }
};
int main() {
  Employee* emp = new Employee[3];
  emp[0].work();
  emp[1].work();
  emp[2].work();

  delete emp;

  return 0;
}

Producción :

Error in `./example1.cpp': munmap_chunk(): invalid pointer: 0x000000000117f018 ***
timeout: the monitored command dumped core
/bin/bash: line 1:    33 Aborted                 timeout 15s ./0f6c05b9-ee09-44c3-acee-8ad8a882ac5e < 0f6c05b9-ee09-44c3-acee-8ad8a882ac5e.in

Constructor of Employee class was called!
Constructor of Employee class was called!
Constructor of Employee class was called!
Still working!
Still working!
Still working!
Destructor of Employee class was called!

Por lo tanto, como puede ver en el resultado anterior, los constructores y la función work se llamaron para los tres objetos, pero el destructor solo se llamó una vez para un solo objeto, después de lo cual el programa se bloqueó.

Conclusión

En este artículo, hemos discutido el destructor de arreglos dinámicos en C++. Los destructores son funciones miembro especiales que se llaman automáticamente cuando se va a eliminar un objeto.

Usamos el operador borrar para borrar un objeto de una clase; sin embargo, solo elimina un único objeto de una clase. Para eliminar una matriz dinámica o una matriz de objetos, usamos el operador remove[].

Tanto los operadores como su uso se han explicado con ejemplos adecuados en este artículo.

Artículo relacionado - C++ Array

Artículo relacionado - C++ Destructor