дин. память, а затем выбросили исключение не обработав. Что делать с той дин. памятью и может что еще нужно? Или нужно не допускать таких ситуаций и все обрабатывать в конструкторе или функциональным try-блоком
Дам абстрактный ответ: если ты выделяешь в конструкторе динамическую память и сохраняешь её в сырой указатель - проблема в этом, а не в исключении
Если в конструкторе было выкинуто исключение - то деструктор этого класса не вызывается. Вызывается деструктор только у полей класса, которые созданы на стеке Стандартное решение, чтобы память в этом случае не утекала - обернуть её в unique_ptr
причем тут стек вообще?
При том, что если ты создашь объект на куче - у него ничего не вызовется, пока явно не сделаешь delete
struct S {}; struct B { S s; }; int main() { auto p = std::make_unique<B>(); }
В корректной программе на каждый (отработавший) конструктор вызывается деструктор, явно или неявно
Если кинуто исключение - то он очевидно не считается отработавшим
Неточно. Будут вызваны деструкторы всех полей, которые были инициализированы в момент выброса исключения. Сам this создан только после завершения конструктора, поэтому его деструктор не вызывается
И если не был вызван делигирующий конструктор
Обсуждают сегодня