А с точки зрения программы это нормально?
А кто будет ловить это исключение?
Иного способа сказать, что в конструкторе что-то пошло не так - нет.
нужно понять, какие причины в вашем случае, что в конструкторе что-то пошло не так
Так обьект же не до инициализируеться, это не есть хорошо
If an exception is thrown from a constructor of an object (regardless of the object's storage duration), destructors are called for all fully-constructed non-static members and base classes, in reverse order of completion of their constructors. ... If the exception is thrown from a constructor that is invoked by a new-expression, the matching deallocation function is called, if available. https://en.cppreference.com/w/cpp/language/throw#Stack_unwinding
Забавный факт: в тексте Стандарта - may be called
Так причем тут это, обьект еще не инициализирован
Читаем внимательнее: destructors are called for all fully-constructed non-static members and base classes То есть деструктор вызывается для всех базовых классов цепочки наследования и для всех уже созданных мемберов. Опять же, если вы в конструкторе аллоцируете динамическую память, но уже оператор new может сам выбросить исключение, или любой из стандартных контейнеров. Иной подход - пустой конструктор и дополнительный метод bool Init() который уже не будет бросать исключений, а возвращать признак успешности инициализации.
косяк cppreference по идее....
Как тестить Out of Memory?
Так можно же
Ну, да, создашь OOM, new или std::vector::push_back() выбросят исключение, а ты и не ожидал. Мы же тестим, чтобы не кидать исключения
Обсуждают сегодня