Middle+
47
questionbank

О чем стоит помнить, когда выбрасывается исключение из конструктора?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

При выбросе исключения из конструктора необходимо помнить о неполной инициализации объекта.

Автоматически высвобождаются ресурсы, полученные в конструкторе до точки выброса исключения (локальные переменные, члены класса с автоматическим временем жизни). Ресурсы, выделенные динамически (например, через new), но не обернутые в умные указатели, не будут автоматически освобождены, что приведет к утечке памяти.

Пример утечки памяти:

cpp

Пример с использованием умного указателя для предотвращения утечки:

cpp

Важно использовать принцип Resource Acquisition Is Initialization (RAII), оборачивая управляемые ресурсы в объекты, деструкторы которых гарантируют их освобождение при выходе из области видимости или при уничтожении объекта. Умные указатели (std::unique_ptr, std::shared_ptr) являются стандартным способом реализации RAII для динамически выделенной памяти. Контейнеры стандартной библиотеки также следуют этому принципу.

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

cpp