Estoy aprendiendo sobre el idioma RAII en C++, y cómo usar punteros inteligentes.¿Cómo funciona RAII cuando un constructor lanza una excepción?
En mi lectura, me he encontrado con dos cosas que, para mí, parecen contradecirse entre sí.
Citado de http://www.hackcraft.net/raii/:
... si un objeto miembro con la semántica RAII ha sido creado y una excepción que ocurre antes de que el constructor ha completado entonces su destructor será llamado como parte de la pila de desenrollado. Por lo tanto, un objeto que controle múltiples recursos puede garantizar su limpieza incluso si no está completamente construido mediante el uso de objetos RAII miembros.
Pero citado de http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.10:
Si un constructor lanza una excepción, destructor del objeto no se ejecuta. Si su objeto ya ha hecho algo que debe deshacerse (como asignar algo de memoria, abrir un archivo o bloquear un semáforo), este "elemento que debe deshacerse" debe ser recordado por un miembro de datos dentro del objeto.
Y luego, la segunda fuente vinculada recomienda el uso de punteros inteligentes para tratar el tema de las cosas que ya estaban asignadas en el constructor.
Entonces, ¿qué sucede realmente en estos escenarios?
+1 esta es la forma en que "newprogrammer [s]" * debería * hacer preguntas! –