Middle+
27
0
questionbank

Когда при вызове исключения (exception) не вызываются деструкторы?

Ответ от нейросети sobes.tech

Не вызываются деструкторы локальных объектов с автоматическим временем жизни, если исключение брошено в конструкторе и объект не был полностью сконструирован.

Также деструкторы не вызываются для:

  • Объектов с глобальным или статическим временем жизни.
  • Объектов в сырой памяти, которые не управляются стандартными механизмами (например, выделены через malloc и не были освобождены).
  • Объектов, на которые указывают утекающие умные указатели.
  • Объектов, чьи деструкторы помечены как noexcept(false) и сами бросают исключение во время раскрутки стека (stack unwinding). В этом случае программа обычно аварийно завершается (std::terminate).

Пример невызова деструктора в конструкторе:

cpp

Не вызываются деструкторы локальных объектов с автоматическим временем жизни, если исключение брошено в конструкторе и объект не был полностью сконструирован.

Также деструкторы не вызываются для:

  • Объектов с глобальным или статическим временем жизни.
  • Объектов в сырой памяти, которые не управляются стандартными механизмами (например, выделены через malloc и не были освобождены).
  • Объектов, на которые указывают утекающие умные указатели.
  • Объектов, чьи деструкторы помечены как noexcept(false) и сами бросают исключение во время раскрутки стека (stack unwinding). В этом случае программа обычно аварийно завершается (std::terminate).

Пример невызова деструктора в конструкторе:

cpp

Зарегистрируйтесь или войдите, чтобы получить доступ к полным ответам на все вопросы из банка вопросов.

exceptiondestructorcontext-managerresource-managementmemory-management