Destructor de vectores en C++
Este artículo analiza los destructores y su uso al crear vectores y cadenas en C++.
Destructores en C++
En el paradigma OOP, un destructor es una función miembro asociada con cada clase que se ejecuta automáticamente cada vez que se elimina un objeto de la clase o finaliza su vida útil. Además, se llaman destructores para todas las variables creadas en la memoria del montón.
Cuando se eliminan dichas variables, se llama al destructor para que la memoria se libere para su uso posterior.
Los destructores se crean con el mismo nombre que el nombre de la clase con un prefijo de símbolo en mosaico (~
). En una clase, cada objeto creado con un constructor se elimina con un destructor, pero en orden inverso al de su creación.
La sintaxis para destructor es:
~<className>() {
// coding
}
Consideremos una clase de ejemplo.
#include <iostream>
using namespace std;
class DestructorExample {
public:
DestructorExample() { cout << "In Constructor of DestructorExample" << endl; }
~DestructorExample() { cout << "In Destructor of DestructorExample"; }
};
int main() {
DestructorExample t;
return 0;
}
Esto dará la siguiente salida.
In Constructor of DestructorExample
In Destructor of DestructorExample
Destructores de Vectores y Cadenas en C++
Si está utilizando std::vector
y std::string
, el destructor se llama automáticamente cuando sus objetos están fuera del alcance. Estas clases tienen implementados sus destructores, que se activan automáticamente cuando es necesario eliminar sus objetos correspondientes.
Por lo tanto, no necesita llamarlos o implementarlos explícitamente.
Pero si tiene un vector de puntero a alguna clase, entonces estos objetos deben eliminarse explícitamente de esta manera:
#include <iostream>
#include <vector>
using namespace std;
class MyClass {
public:
MyClass() { cout << "Object Created" << endl; }
~MyClass() { cout << "Object Destroyed" << endl; }
};
int main() {
vector<MyClass*> testVec;
// Creating the objects
MyClass* p = NULL;
for (int i = 0; i < 3; i++) {
p = new MyClass();
testVec.push_back(p);
}
// Destroying the objects
for (auto p : testVec) {
delete p;
}
testVec.clear();
return 0;
}
Producción :
Object Created
Object Created
Object Created
Object Destroyed
Object Destroyed
Object Destroyed
Iteramos sobre el vector y eliminamos cada objeto explícitamente. Se ha liberado la memoria en un montón; por lo tanto, podemos usar el método .clear()
para eliminar todos los elementos del vector.
Ahora los objetos MyClass*
deben eliminarse explícitamente; el vector no eliminará estos objetos. Por lo tanto, puede decir que si hay objetos de clase simple en vectores, esos objetos se eliminarán automáticamente.
Pero si tiene un puntero, debe eliminarse explícitamente.