在调用main
之前执行代码绝对是可能的,正如this question中的许多示例所示。
但是,如果在该主要代码中,该程序被告知要通过std::exit
或std::abort
退出?由于main
被定义为程序的开始,因此在开始之前退出会产生什么后果?
在每个部分打印一些内容后,我得到以下结果:
格式:
部分:output
主要:main
初始化(在主要之前调用):init
退出(在初始设置中使用std::atexit
进行设置):exiting
示例运行:
在没有退出的情况下调用了Init:
初始化
主要
返回0
Init调用std :: exit(0):
初始化
返回0
Init调用std :: abort:
初始化
在Windows上使用GCC 4.7.2 发生崩溃并返回3 崩溃并打开VS11 的常用方框 在LiveWorkSpace上返回0
Init设置处理程序并调用std :: exit(0):
初始化
退出
返回0
Init设置处理程序并调用std :: abort:
初始化
与没有处理程序相同的交易
在搜索时,我看到了这个问题:Is there any way a C/C++ program can crash before main()?。但是,它没有回答我想知道的问题:是否有任何此类行为,在std::exit
之前调用std::abort
或main
,定义明确?是否存在任何未定义的行为?
答案 0 :(得分:7)
简短的回答是:(几乎)没有后果。如果你意外地调用exit
,可能不会调用某些析构函数,但这几乎就是它
通常,不调用析构函数不是最简洁的方法,但最终结果将是相同的。
当进程终止时(通过exit
或abort
或仅通过segfaulting或其他原因),句柄(内核对象,文件等)被关闭,并且与程序关联的内存地址空间由操作系统回收。
也没有太多其他内容,因为当你调用exit
或abort
时,你基本上要求程序终止(这些函数永远不会返回!)所以你真的不能期待之后发生任何事情。
请注意,在Init
之前注册要调用的函数main
是非标准的东西,但是通过在全局中使用构造函数可以获得相同的效果。