Определенно возможно выполнить код раньше main
называется, как видно из многих примеров в этот вопрос.
Тем не менее, что если в этом основном коде программе сообщается о выходе через std::exit
или же std::abort
? поскольку main
определяется как запуск программы, каковы последствия выхода из нее до ее запуска?
После печати чего-то в каждом разделе я получаю следующие результаты:
Формат:
Раздел: output
Главный: main
Init (вызывается перед main): init
Выход (настраивается с помощью std::atexit
внутри иници): exiting
Образцы прогонов:
Вызван init без выхода:
в этом
главный
возвращает 0
Init вызывает std :: exit (0):
в этом
возвращает 0
Init вызывает std :: abort:
в этом
вылетает и возвращает 3 в Windows с GCC 4.7.2
вылетает и поднимает обычную коробку с VS11
возвращает 0 в LiveWorkSpace
Init устанавливает обработчик и вызывает std :: exit (0):
в этом
выход
возвращает 0
Init устанавливает обработчик и вызывает std :: abort:
в этом
та же сделка, что и без обработчика
Во время поиска я увидел этот вопрос: Есть ли какой-нибудь способ, которым программа C / C ++ может аварийно завершить работу перед main ()?. Тем не менее, это не отвечает на то, что я хочу знать: std::exit
или же std::abort
до main
, четко определены? Есть ли что-нибудь из этого неопределенного поведения?
Короткий ответ: нет (почти) никаких последствий. Некоторые деструкторы могут не вызываться, если вы неожиданно вызываете exit
, но это почти все.
Как правило, не вызывать деструкторы — это не самый чистый способ, но опять же конечный результат будет таким же.
Когда процесс завершается (через exit
или же abort
или просто по ошибке или по другой причине) дескрипторы (объекты ядра, файлы и т. д.) закрываются, а память, связанная с адресным пространством программы, освобождается операционной системой.
В этом нет ничего особенного, потому что когда вы звоните exit
или же abort
вы в основном запрашиваете завершение программы (эти функции никогда не возвращаются!), поэтому вы действительно не можете ожидать, что что-то произойдет после этого.
Обратите внимание, что регистрация функции, как Init
быть вызванным раньше main
это нестандартный материал, но вы можете получить тот же эффект, имея конструктор в глобальном.
Других решений пока нет …