Краш в gcc при создании статического глобального объекта
Почему clang исполняет верно, а gcc крашит эту программу? godbolt
struct A {
A();
~A();
};
static A a;
int main() {
}
#include <iostream>
A::A() {
std::cout << "A::A()\n";
}
A::~A() {
std::cout << "A::~A()\n";
}
Ответы (1 шт):
Автор решения: HolyBlackCat
→ Ссылка
std::cout требует инициализации перед использованием.
Обычно эта инициализация происходит автоматически, за счет того, что #include <iostream> содержит в том числе static переменную, которая в своем конструкторе делает эту инициализацию. (Хотя в libstdc++-13 вроде придумали способ поумнее.)
Но чтобы это нормально работало, #include <iostream> должен находиться над глобальными переменными, которые используют std::cout. (И то для шаблонных переменных это не спасает.)
Решение - либо инклудить <iostream> повыше, либо инициализировать руками, вот так:
std::ios_base::Init init;
std::cout << "A::A()\n";