Частично RAII решает, когда объект становится ответственным за свою собственную очистку - правило состоит в том, что объект становится ответственным, если и когда инициализация его конструктора завершится. Симметрия инициализации и очистки, конструктор и деструктор, означает, что они тесно связаны друг с другом.
Одним из пунктов RAII является обеспечение безопасности исключений - чтобы приложение оставалось самосогласованным при возникновении исключений. На первый взгляд это тривиально - когда исключение вызывает выход из области действия, локальные переменные в этой области действия должны быть уничтожены.
Но что произойдет, если исключение происходит в конструкторе?
Ну, объект не был полностью построен, поэтому не может быть безопасно разрушен. Конструктор должен иметь блоки по мере необходимости, чтобы гарантировать, что все необходимые очистки будут выполнены до того, как исключение распространится. Как только исключение распространится за пределы области, в которой был создан объект, не будет вызова деструктора, поскольку объект не был создан в первую очередь.
Рассмотрим, в частности, конструкторы для данных членов внутри разрушаемого объекта. Если один из них выдает исключение, код вашего основного конструктора не будет работать вообще, но будет иметь некоторый код, который образует неявную часть этого конструктора. Все члены, которые были успешно построены, будут автоматически уничтожены. Любые члены, которые не были созданы (в том числе тот, который вызвал исключение), не являются.
Таким образом, в основном RAII - это политика, которая гарантирует, что все, что будет полностью построено, будет уничтожено своевременно, особенно при наличии исключений, и что любой объект либо будет полностью построен, либо нет (не существует половины построенные объекты, которые вы не можете знать, как безопасно убирать). Выделенные ресурсы также освобождаются. И большая часть работы автоматизирована, поэтому программисту не нужно слишком беспокоиться об этом.