RAII se trata en parte de decidir cuándo un objeto se hace responsable de su propia limpieza; la regla es que el objeto se vuelve responsable si y cuando se completa la inicialización del constructor. La simetría de inicialización y limpieza, constructor y destructor, significa que los dos tienen vínculos estrechos entre sí.
Un punto de RAII es garantizar la seguridad de las excepciones: que la aplicación siga siendo coherente cuando se lanzan excepciones. A primera vista, esto es trivial: cuando una excepción hace que salga un ámbito, las variables locales en ese ámbito deben destruirse.
Pero, ¿qué sucede si el lanzamiento de excepción ocurre dentro de un constructor?
Bueno, el objeto no se ha construido completamente, por lo que no se puede destruir con seguridad. El constructor debe tener bloques de prueba según sea necesario para garantizar que se realicen las limpiezas necesarias antes de que se propague la excepción. Una vez que la excepción se propague fuera del alcance donde se construyó el objeto, no habrá una llamada de destructor, porque el objeto no se construyó en primer lugar.
Considere en particular los constructores de datos de miembros dentro del objeto que se está destruyendo. Si uno de esos arroja una excepción, su código de constructor principal no se ejecutará en absoluto, pero sí lo tendrá algún código que forme parte implícita de ese constructor. Cualquier miembro que se haya construido correctamente se destruirá automáticamente. Los miembros que no fueron construidos (incluido el que arrojó la excepción) no lo son.
Básicamente, RAII es una política que garantiza que todo lo que se construya completamente se destruirá de manera oportuna, particularmente en presencia de lanzamientos de excepción, y que cualquier objeto se construya completamente o no (no hay mitad) objetos construidos que no puedes saber cómo limpiar de forma segura). Los recursos que se asignan también se liberan. Y gran parte del trabajo está automatizado, por lo que el programador no tiene que preocuparse demasiado por ello.