Capisco il concetto di RAII:
Utilizzare il distruttore come mezzo per liberare risorse, come la memoria, o chiudere handle di file / connessioni database. Provenendo da uno sfondo Java, questo in realtà era piuttosto facile da capire a causa delle somiglianze con finally
.
Tuttavia, non capisco quando effettivamente dovresti applicarlo. Ovviamente dovrebbe essere implementato durante l'inizializzazione degli oggetti nell'heap, ma quali sono gli altri scenari per i quali un normale programmatore dovrebbe usarlo? Esaminando questo thread ho trovato fuori che per esempio std::ifstream
ha già implementato RAII per gestire la liberazione del suo handle di file. Quindi avvolgerlo in un altro oggetto solo per chiamare ifstreamObj.close()
nel suo distruttore sarebbe una perdita di tempo. Ma sono abbastanza sicuro che questa non è una regola generale che si applica a tutte le librerie là fuori.
Quindi la mia domanda è: quando dovrei effettivamente usare RAII? Esiste una regola empirica generale, una best practice o devo strisciare attraverso la documentazione di ogni classe se voglio essere sicuro? Oppure posso essere certo che ogni classe che implementa un metodo close()
/ free()
/ delete()
(o qualcosa di simile) si occupa anche di chiamarla correttamente quando necessario?