Когда инициализируются статические поля класса? Что будет если при инициализации статического поля сгенерируется исключение?

Рейтинг: 0Ответов: 1Опубликовано: 10.03.2023

Данный код сработает до запуска main()? Что будет если при инициализации m_filed произойдет исключение? Когда вызовется деструктор m_field?

class Example {

private:
static int m_field;
}

int Example::m_field = 0;

Ответы

▲ 6Принят

Сколько времени нужно, чтоб набросать вот такой тестовый код

struct Info
{
    Info() { cout << "ctor Info\n"; }
    ~Info() { cout << "dtor Info\n"; }
};

struct Test
{
    static Info ii;
};

Info Test::ii;

int main(int argc, char * argv[])
{
    cout << "main()\n";
}

и получить ответы почти на все ваши вопросы? :) Вы не верите разработчикам компиляторов? :)

Ну, а в ответ на все неперехваченные исключения вызывается функция terminate().

Чтоб убедиться — исправьте код выше так:

Info()  {
    set_terminate([](){cout << "Unhandled exception\n" << flush; });
    cout << "ctor Info\n"; throw 0; 
}