Я изучаю идиому RAII на С++ и как использовать интеллектуальные указатели.
В моем чтении я столкнулся с двумя вещами, которые, как мне кажется, противоречат друг другу.
Цитата из http://www.hackcraft.net/raii/:
... если объект-член с семантикой RAII был создан и исключение происходит до завершения конструктора, его деструктор будет вызван как часть разворачивания стека. Следовательно, объект, который управляет несколькими ресурсами, может гарантировать их очистку, даже если он полностью не сконструирован с использованием объектов-членов RAII.
Но цитируется из http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.10:
Если конструктор генерирует исключение, деструктор объекта не запускается. Если ваш объект уже сделал что-то, что нужно отменить (например, выделение некоторой памяти, открытие файла или блокировка семафора), этот "материал, который нужно отменить" должен быть запомнен элементом данных внутри объекта.
И затем второй связанный источник рекомендует использовать интеллектуальные указатели для решения проблемы вещей, которые уже были выделены в конструкторе.
Итак, что на самом деле происходит в этих сценариях?