Как работает RAII, когда конструктор выбрасывает исключение?

Я изучаю идиому RAII в C++, и как использовать умные указатели.

Читая, я столкнулся с двумя вещами, которые, как мне кажется, противоречат друг другу.

Цитата из http://www.hackcraft.net/raii/:

...если был создан объект-член с семантикой RAII и исключение произошло до завершения работы конструктора, то его деструктор будет вызван как часть разворачивания стека. Следовательно, объект, управляющий несколькими ресурсами, может гарантировать их очистку, даже если он не полностью построен, используя объекты-члены RAII".

Но цитата из http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.10:

Если конструктор выбрасывает исключение, деструктор объекта не запускается. Если ваш объект уже сделал что-то, что должно быть отменено (например, выделил память, открыл файл или заблокировал семафор), это "что-то, что должно быть отменено" должно быть запомнено членом данных внутри объекта.

А второй источник по ссылке рекомендует использовать умные указатели для решения проблемы вещей, которые уже были выделены в конструкторе.

Так что же на самом деле происходит в этих сценариях?

19
задан Lightness Races with Monica 10 February 2013 в 21:14
поделиться