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

Вот код (действительный C и С++)

#include <stdio.h>

int main() {
    printf("asfd");
    // LINE 1
    return 0;
}

Если в строке 1 я поставлю segfaulting выражение, программа просто потерпит крах без печати ничего (как и ожидалось).

Но почему вышеприведенный код печатает "asdf" и не выходит из буфера без сброса? Что находится под капотом и почему оно работает должным образом?

Ответ 1

Это выполняется этими двумя разделами в спецификации языка С++:

[basic.start.main]

Оператор return в main имеет функцию выхода из основной функции и вызова exit с возвращаемым значением в качестве аргумента.

и

[lib.support.start.term]

Функция exit имеет дополнительное поведение в этом международном стандарте:

  • ...
  • Затем все открытые потоки C с ненаписанными буферизованными данными будут сброшены.
  • ...

Ответ 2

Как правило, возврат из main не является завершением вашей программы и не является входом в main начало.

Обычно компоновщик, который создает окончательный исполняемый файл для вашей программы, отмечает место, возможно, названное start, в качестве места начала выполнения. Когда операционная система загружает вашу программу и начинает ее выполнять, она запускает выполнение в этом месте. Там есть код, который устанавливает среду: создает стек, устанавливает состояния потоков и т.д. Затем этот код вызывает main.

Когда возвращается main, он возвращается к этому специальному коду. Затем этот код выполняет различную работу по очистке, которая требуется в конце программы на C или С++, как описано в этом ответе.

Если программа завершается внезапно, этот окончательный код может не выполняться.

Ответ 3

Когда main() завершается, все открытые потоки закрываются... для включения stdout. Закрытие открытого потока flushes stdout и то, что вы написали в буфер, передается с новой линией или без нее.