Краш в gcc при создании статического глобального объекта

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

Почему 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";
}

Ответы

▲ 4Принят

std::cout требует инициализации перед использованием.

Обычно эта инициализация происходит автоматически, за счет того, что #include <iostream> содержит в том числе static переменную, которая в своем конструкторе делает эту инициализацию. (Хотя в libstdc++-13 вроде придумали способ поумнее.)

Но чтобы это нормально работало, #include <iostream> должен находиться над глобальными переменными, которые используют std::cout. (И то для шаблонных переменных это не спасает.)

Решение - либо инклудить <iostream> повыше, либо инициализировать руками, вот так:

std::ios_base::Init init;
std::cout << "A::A()\n";