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++
#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
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 usa convenzioni sui nomi, callback, macro e struct con il contesto.
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