Destructores y limpieza
Libere recursos automáticamente
Destructores y limpieza es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
Qué hace un destructor
Un destructor se ejecuta cuando termina el ciclo de vida de un objeto. Su función es liberar todo lo que posee el objeto. Su nombre es ~ClassName.
#include <iostream>
class File {
public:
~File() { std::cout << "closing file\n"; }
};
int main() {
File f;
} // ~File runs hereLiberación de la memoria propia
Si una clase posee memoria del montón, su destructor debe liberarla. Este es el lugar clásico para llamar a delete.
#include <iostream>
class Buffer {
int* data;
public:
Buffer(int n) : data(new int[n]) {}
~Buffer() { delete[] data; } // cleanup
};
int main() { Buffer b(10); }Los destructores se ejecutan automáticamente
No debe llamar personalmente a los destructores de los objetos de la pila: el compilador inserta la llamada al final del ámbito.
Orden inverso de los miembros
Los objetos miembro se destruyen en el orden inverso al de su declaración, después de que se ejecuta el cuerpo del destructor.
#include <iostream>
struct A { ~A() { std::cout << "~A\n"; } };
struct B { ~B() { std::cout << "~B\n"; } };
struct C {
A a;
B b; // destroyed before a
~C() { std::cout << "~C\n"; }
};
int main() { C c; }Destructores virtuales
Si elimina un objeto derivado mediante un puntero a la clase base, el destructor de la clase base debe ser virtual; de lo contrario, la parte derivada queda sin liberar.
#include <iostream>
struct Base {
virtual ~Base() { std::cout << "~Base\n"; }
};
struct Derived : Base {
~Derived() override { std::cout << "~Derived\n"; }
};
int main() {
Base* p = new Derived();
delete p; // both run thanks to virtual
}Los destructores no deben lanzar excepciones
Lanzar una excepción desde un destructor mientras se desenrolla la pila termina el programa. Los destructores deben declararse (implícitamente) noexcept y no deben dejar escapar excepciones.
El destructor predeterminado
Si no escribe ninguno, el compilador genera un destructor que destruye cada miembro. Para las clases cuyos miembros son únicamente tipos RAII, eso es exactamente lo correcto.
#include <string>
#include <vector>
struct Record {
std::string name; // self-cleaning
std::vector<int> values; // self-cleaning
}; // default destructor is enoughDestructor = default
Escriba ~Class() = default; para solicitar explícitamente el destructor generado por el compilador; resulta útil cuando necesita un destructor virtual, pero no lógica personalizada.
#include <iostream>
struct Shape {
virtual ~Shape() = default; // virtual + default
};Liberación de recursos que no son memoria
Los destructores también cierran archivos, liberan bloqueos y desconectan sockets, no solo liberan memoria. Todo recurso adquirido debe liberarse aquí.
Orden entre objetos
Las variables locales múltiples se destruyen en el orden inverso al de su construcción, por lo que un destructor puede usar de forma segura los objetos creados antes que él.
Deje que los miembros RAII hagan el trabajo
Si cada miembro es de un tipo RAII, a menudo no necesita ningún destructor personalizado. Reserve los destructores escritos manualmente para los recursos sin procesar.
Comprobación rápida
Compruebe su comprensión de los destructores.
Resumen
Ha aprendido que los destructores liberan automáticamente los recursos propios al final del ciclo de vida, ejecutan la destrucción de los miembros en el orden inverso al de su declaración, no deben lanzar excepciones y deben ser virtual en las clases base polimórficas. Los miembros RAII suelen hacer innecesarios los destructores personalizados.
Preguntas frecuentes
¿La lección «Destructores y limpieza» es gratis?
Sí — el texto completo de «Destructores y limpieza» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Destructores y limpieza»?
Libere recursos automáticamente Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Destructores y limpieza»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- El principio RAII
- Destructores y limpieza
- Regla de tres/cinco
- Guardas de ámbito