C++ moderno e alternative C

RAII e la liberazione automatica delle risorse in C++

In questa lezione confronterai la chiusura sicura di un file in C con la tecnica RAII del C++, in cui le risorse vengono liberate automaticamente.

Introduzione

RAII (Resource Acquisition Is Initialization) è la tecnica di legare la vita di una risorsa, come un file, un'area di memoria o una connessione, alla vita di un oggetto. Quando l'oggetto viene distrutto, la risorsa viene liberata automaticamente in ogni uscita dal blocco, anche se si verifica un'eccezione.

Punti importanti

  • Capisci come si fa in C prima di imparare le astrazioni del C++.
  • Usa RAII e la semantica di valore (value semantics) per esprimere il possesso delle risorse.
  • Preferisci gli strumenti del C++ con sicurezza dei tipi a macro e conversioni di tipo.

Esempi di codice C e C++

C
Esegui →
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;
}
Risultato dell'esecuzione
saved
C++
Esegui →
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";
}
Risultato dell'esecuzione
saved

Confronto tra C e C++

In C, il programma usa l'etichetta cleanup e l'istruzione goto perché tutti i percorsi, di successo o di errore, passino per il fclose che chiude il file. In C++, std::ofstream chiude il file nel distruttore (destructor) quando la variabile file esce dall'ambito. Così la gestione delle risorse è più pulita e si riduce il rischio di dimenticare di liberarle.

C

C usa convenzioni sui nomi, callback, macro e struct con il contesto.

C++

C++ offre astrazioni con un ambito chiaro, sicure rispetto ai tipi e che di solito non costano nulla in più in esecuzione.

Esercizi di approfondimento

Esegui entrambe le versioni e poi modifica il codice per osservare la differenza di sicurezza che offre ciascun linguaggio.

  • Scrivi prima il meccanismo in C e solo dopo usa la funzionalità equivalente del C++.
  • Sostituisci la liberazione manuale delle risorse con RAII.
  • Controlla se la funzionalità causa allocazioni di memoria o chiamate a funzioni virtuali.

Esercitati con una sfida

Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.

Tutte le sfide