RAII y la liberación automática de recursos en C++
En esta lección vas a comparar el cierre seguro de un archivo en C con la técnica RAII de C++, en la que los recursos se liberan automáticamente.
Introducción
RAII (Resource Acquisition Is Initialization) es una técnica que une la vida de un recurso, como un archivo, una zona de memoria o una conexión, a la vida de un objeto. Cuando el objeto se destruye, el recurso se libera automáticamente salga como salga del bloque, incluso si ocurre una excepción.
Puntos importantes
- Entiende cómo se hace en C antes de aprender las abstracciones de C++.
- Expresa la propiedad de los recursos con RAII y la semántica de valor (value semantics).
- Usa las herramientas de C++ con seguridad de tipos en lugar de macros y conversiones de tipo.
Ejemplos de código C y C++
#include <stdio.h>
int main(void) {
int result = 1;
FILE *file = fopen("scores.txt", "w");
if (!file) goto cleanup;
if (fputs("Ada 95\n", file) < 0) goto cleanup;
result = 0;
cleanup:
if (file) fclose(file);
puts(result ? "failed" : "saved");
return result;
}
saved
#include <fstream>
#include <iostream>
int main() {
std::ofstream file("scores.txt");
if (!file) return 1;
file << "Ada 95\n";
std::cout << "saved\n";
}
saved
Comparación entre C y C++
En C, el programa usa la etiqueta cleanup y la instrucción goto para que todos los caminos, tanto de éxito como de error, pasen por el fclose que cierra el archivo. En C++, std::ofstream cierra el archivo en su destructor (destructor) cuando la variable file sale de su ámbito. Así la gestión de recursos es más limpia y hay menos riesgo de olvidarse de liberarlos.
C usa convenciones de nombres, callbacks, macros y struct de contexto.
C++ ofrece abstracciones con un alcance bien delimitado, con seguridad de tipos y normalmente sin coste adicional al ejecutar.
Ejercicios de práctica
Ejecuta las dos versiones y después modifica el código para ver la diferencia de seguridad que aporta cada lenguaje.
- Escribe primero el mecanismo en C y después usa la función equivalente de C++.
- Sustituye la liberación manual de recursos por RAII.
- Comprueba si la función provoca reservas de memoria o llamadas a funciones virtuales.
Practica con un reto
Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.
Todos los retos