Это хорошо определенное поведение, чтобы выйти из программы перед основной?

Определенно возможно выполнить код раньше 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, четко определены? Есть ли что-нибудь из этого неопределенного поведения?

11

Решение

Короткий ответ: нет (почти) никаких последствий. Некоторые деструкторы могут не вызываться, если вы неожиданно вызываете exit, но это почти все.
Как правило, не вызывать деструкторы — это не самый чистый способ, но опять же конечный результат будет таким же.

Когда процесс завершается (через exit или же abort или просто по ошибке или по другой причине) дескрипторы (объекты ядра, файлы и т. д.) закрываются, а память, связанная с адресным пространством программы, освобождается операционной системой.

В этом нет ничего особенного, потому что когда вы звоните exit или же abortвы в основном запрашиваете завершение программы (эти функции никогда не возвращаются!), поэтому вы действительно не можете ожидать, что что-то произойдет после этого.

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

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]