Согласно cppreference :
При возврате из основной функции либо с помощью оператора return, либо до конца функции выполняется exit()
, передавая аргумент оператора return (или 0, если использовался неявный возврат) как exit_code.
Другими словами, вызов exit
аналогичен возврату из main
(или падению end), который, в свою очередь, вызывает деструкторы любых статически выделенных объектов перед окончательным завершением программы.
Тем не менее, std::exit
предлагает соответствующие гарантии, так что это тот, который нужно использовать.
Живая демонстрация
Изменить: Если вы хотите, чтобы переменные, выделенные в локальной области, были уничтожены (см. Обсуждение), вы можете создать настраиваемое исключение в точке, где вы хотите выйти из программы, и поймать его в main
, например
class ExitProgramException {};
void foo ()
{
...
if (exit_program)
{
ExitProgramException e;
throw e;
}
}
void bar ()
{
foo ();
}
int main ()
{
try
{
bar ();
}
catch (const ExitProgramException& e)
{
}
}
Это должно гарантировать правильную размотку стека.
Живая демонстрация