C++ moderno y alternativas en C

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++

C
Ejecutar →
main.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;
}
Resultado de la ejecución
saved
C++
Ejecutar →
main.cpp
#include <fstream>
#include <iostream>

int main() {
    std::ofstream file("scores.txt");
    if (!file) return 1;
    file << "Ada 95\n";
    std::cout << "saved\n";
}
Resultado de la ejecució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

C usa convenciones de nombres, callbacks, macros y struct de contexto.

C++

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