C++RAII: l'acquisizione delle risorse è inizializzata


Osservazioni

RAII è l'acronimo di R esource A cquisition I s I nitialization. Anche a volte indicato come SBRM (Scope-Based Resource Management) o RRID (Resource Release Is Destruction), RAII è un idioma utilizzato per legare le risorse alla durata dell'oggetto. In C ++, il distruttore per un oggetto viene sempre eseguito quando un oggetto esce dall'ambito di applicazione - possiamo trarne vantaggio per collegare la pulizia delle risorse alla distruzione dell'oggetto.

Ogni volta che è necessario acquisire alcune risorse (ad es. Un blocco, un handle di file, un buffer allocato) che sarà necessario rilasciare, si dovrebbe prendere in considerazione l'utilizzo di un oggetto per gestire tale gestione delle risorse. Lo sbobinamento dello stack avverrà indipendentemente dall'eccezione o dall'uscita dell'ambito iniziale, quindi l'oggetto gestore risorse ripulirà la risorsa per te senza dover considerare attentamente tutti i possibili percorsi di codice corrente e futuro.

Vale la pena notare che RAII non completamente libera lo sviluppatore di pensare alla durata delle risorse. Un caso è, ovviamente, una chiamata crash o exit (), che impedirà il richiamo dei distruttori. Dal momento che il SO pulirà il processo, le risorse locali come la memoria dopo la fine di un processo, questo non è un problema nella maggior parte dei casi. Tuttavia con le risorse di sistema (ad es. Named pipe, lock file, shared memory) hai ancora bisogno di strutture per gestire il caso in cui un processo non si è ripulito da solo, cioè all'avvio test se il file di lock è lì, se lo è, verificare il processo con il pid effettivamente esiste, quindi agire di conseguenza.

Un'altra situazione è quando un processo unix chiama una funzione della famiglia exec, cioè dopo un fork-exec per creare un nuovo processo. Qui, il processo figlio avrà una copia completa della memoria dei genitori (inclusi gli oggetti RAII) ma una volta che è stato chiamato exec, nessuno dei distruttori sarà chiamato in quel processo. D'altra parte, se un processo è biforcato e nessuno dei processi chiama exec, tutte le risorse vengono ripulite in entrambi i processi. Questo è corretto solo per tutte le risorse effettivamente duplicate nel fork, ma con le risorse di sistema, entrambi i processi avranno solo un riferimento alla risorsa (cioè il percorso di un file di blocco) e cercheranno entrambi di rilasciarlo individualmente, causando potenzialmente l'altro processo fallisce.

RAII: l'acquisizione delle risorse è inizializzata Esempi correlati