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.