Cos'è RAII? Esempi?

19

Sempre quando viene usato il termine RAII, le persone parlano effettivamente di decostruzione invece dell'inizializzazione. Penso di avere una comprensione di base di ciò che potrebbe significare, ma non ne sono del tutto sicuro. Inoltre: il C ++ è l'unico linguaggio RAII? Che dire di Java o C # /. NET?

    
posta Felix Dombek 24.12.2010 - 01:48
fonte

2 risposte

25

Acquisizione risorse Is Initialization significa che gli oggetti dovrebbero prendersi cura di se stessi come un pacchetto completo e non aspettarsi che altri codici comunichino a un'istanza "hey a proposito, presto verrai ripulito - per favore riordina ora". Di solito significa che c'è qualcosa di significativo nel distruttore. Significa anche che scrivi una classe specifica per gestire le risorse, sapendo che in determinate circostanze difficili da prevedere, come le eccezioni generate, puoi contare sull'esecuzione dei distruttori.

Supponiamo che tu voglia scrivere un codice in cui cambierai il cursore di Windows in un cursore di attesa (clessidra, ciambella, ecc.), fai le tue cose e poi cambialo indietro. E dite anche che "fai le tue cose" potrebbe generare un'eccezione. Il modo RAII di farlo sarebbe quello di creare una classe il cui ctor ha impostato il cursore in attesa, il cui unico metodo "reale" ha fatto tutto ciò che si voleva eseguire e il cui datore ha reimpostato il cursore. Le risorse (in questo caso lo stato del cursore) sono legate all'ambito di un oggetto. Quando acquisisci la risorsa, inizializzi un oggetto. Puoi contare sull'oggetto che viene distrutto se vengono lanciate eccezioni, e ciò significa che puoi contare su come pulire la risorsa.

Usare RAII bene significa che non hai bisogno di finally . Certo, si basa sulla distruzione deterministica, che non puoi avere in Java. Puoi ottenere una sorta di distruzione deterministica in C # e VB.NET con using .

    
risposta data 24.12.2010 - 02:03
fonte
4

RAII si occupa in parte di decidere quando un oggetto diventa responsabile della sua pulizia - la regola è che l'oggetto diventa responsabile se e quando la sua inizializzazione del costruttore viene completata. La simmetria dell'inizializzazione e pulizia, costruttore e distruttore, significa che i due hanno stretti legami tra loro.

Un punto di RAII è garantire la sicurezza delle eccezioni - che l'applicazione rimanga auto-coerente quando vengono lanciate eccezioni. A prima vista questo è banale - quando un'eccezione fa uscire un ambito, le variabili locali in quell'ambito devono essere distrutte.

Ma cosa succede se il lancio dell'eccezione avviene all'interno di un costruttore?

Bene, l'oggetto non è stato completamente costruito, quindi non può essere distrutto in modo sicuro. Il costruttore dovrebbe provare i blocchi necessari per garantire che vengano eseguite le necessarie operazioni di pulizia prima che l'eccezione venga propagata. Una volta che l'eccezione si propaga al di fuori dell'ambito in cui è stato costruito l'oggetto, non ci sarà alcuna chiamata al distruttore, perché l'oggetto non è stato costruito in primo luogo.

Considera in particolare i costruttori per i dati dei membri all'interno dell'oggetto che vengono distrutti. Se uno di questi genera un'eccezione, il codice del costruttore principale non verrà eseguito affatto, ma avrà un codice che costituisce una parte implicita del costruttore. Tutti i membri che sono stati costruiti con successo verranno automaticamente distrutti. Tutti i membri che non sono stati costruiti (incluso quello che ha generato l'eccezione) non lo sono.

Quindi fondamentalmente, RAII è una politica che garantisce che tutto ciò che viene completamente costruito verrà distrutto in modo tempestivo, in particolare in presenza di lanci di eccezioni, e che qualsiasi oggetto sia completamente costruito o non lo sia (ci sono niente oggetti costruiti a metà che non puoi sapere come pulire in modo sicuro). Anche le risorse assegnate vengono liberate. E gran parte del lavoro è automatizzato, quindi il programmatore non deve preoccuparsi troppo di esso.

    
risposta data 24.12.2010 - 07:09
fonte

Leggi altre domande sui tag