Разбираем, почему в C++ ресурсы автоматически освобождаются при исключениях (размотка стека и вызов деструкторов), чем
RAII спасает от утечек, но не спасает от «частично применённых» изменений, как формулировать и удерживать инварианты класса, и почему порядок действий в методе критичен для исключений (на примерах с
std::vector,
push_back, счётчиком
next_id_ и рассинхронизацией индексов). В конце — практические приёмы и типичные ошибки, включая правило: деструкторы не должны выбрасывать исключения.