13

正如this questionmain中的许多示例所见,在调用之前执行代码绝对是可能的。

但是,如果在那个 pre-main 代码中,程序被告知通过std::exitor退出std::abort呢?既然main被定义为程序的开始,那么在开始之前退出会有什么后果呢?

在每个部分打印一些内容后,我得到以下结果:

格式:
部分output

Mainmain
Init(在 main 之前调用): Exit(在 Init 内部init
设置std::atexit) :exiting



样品运行:

Init 在没有退出的情况下被调用:

初始化

返回 0

Init 调用 std::exit(0):

初始化
返回 0

Init 调用 std::abort:

init
在 GCC 4.7.2
崩溃的 Windows 上崩溃并返回 3 崩溃并打开通常的框,VS11
在 LiveWorkSpace 上返回 0

Init 设置处理程序并调用 std::exit(0):

初始化
退出
返回 0

Init 设置处理程序并调用 std::abort:

初始化
与没有处理程序相同的交易

在搜索时,我看到了这个问题:C/C++ 程序是否可以在 main() 之前崩溃?. 但是,它没有回答我想知道的问题:是否有任何这种行为,调用std::exitstd::abort之前main,定义明确?有任何这种未定义的行为吗?

4

1 回答 1

7

简短的回答是:(几乎)没有后果。如果您意外调用了一些析构函数,可能不会调用exit,但仅此而已。
通常,不调用析构函数不是最干净的方法,但最终结果还是一样的。

当进程终止时(通过exitabort仅通过段错误或其他原因),句柄(内核对象、文件等)被关闭,并且与程序地址空间相关的内存被操作系统回收。

它也没有什么其他的,因为当你调用exitor时abort,你基本上是在请求程序终止(这些函数永远不会返回!)所以你真的不能指望此后会发生任何事情。

请注意,注册一个像Init之前调用的函数main是非标准的东西,但是您可以通过在全局中使用构造函数来获得相同的效果。

于 2012-11-03T23:55:33.297 回答