Sobes.tech
Back to questions
Junior — Middle
88

Какие моменты необходимо учитывать при выбросе исключения внутри конструктора класса?

Answer from AI

sobes.tech AI

При выбросе исключения внутри конструктора класса в C++ важно учитывать следующие моменты:

  • Если исключение выбрасывается, объект считается не созданным, и деструктор для него не вызывается.
  • Все уже созданные члены объекта, которые были успешно инициализированы до исключения, будут корректно разрушены.
  • Нужно быть осторожным с ресурсами, выделенными до выброса исключения, чтобы избежать утечек памяти.
  • Рекомендуется использовать RAII (Resource Acquisition Is Initialization) — оборачивать ресурсы в объекты, которые сами управляют своей очисткой.

Пример:

class FileWrapper {
    FILE* file;
public:
    FileWrapper(const char* filename) {
        file = fopen(filename, "r");
        if (!file) {
            throw std::runtime_error("Не удалось открыть файл");
        }
    }
    ~FileWrapper() {
        if (file) fclose(file);
    }
};

Здесь, если fopen не удастся, выбросится исключение, и объект не будет создан, при этом не будет утечки ресурсов.