绝对可以在调用main
之前执行代码,如此问题中的许多示例所示。
但是,如果在该预先代码中,该程序被告知通过std::exit
或std::abort
退出?由于main
被定义为程序的开始,因此在开始之前退出会有什么后果?
在每个部分打印某些内容后,我会得到以下结果:
格式:
节:output
main :main
init(在MAIN之前打电话):init
退出(使用std::atexit
INTINE ININE INTIRE):exiting
样本运行:
init nat not non nOwning notiting:
init
主要
返回0
INIT调用STD :: Exit(0):
init
返回0
INIT调用STD :: APORT:
init
用GCC 4.7.2
在Windows上崩溃并返回3 崩溃并用VS11
提出通常的盒子 在LiveWorkSpace上返回0
init设置处理程序并调用std :: exit(0):
init
退出
返回0
INIT设置处理程序并调用STD :: APORT:
init
与没有处理程序的交易
在搜索时,我看到了这个问题:C/C 程序是否有任何方式可以在main()?但是,它没有回答我想知道的:在main
之前调用std::exit
或std::abort
的任何一种行为,定义明确吗?这种未定义的行为中有什么吗?
简短的答案是:几乎没有后果。如果您出乎意料地调用exit
,则可能不会调用某些破坏者,但这几乎就是这样。
通常,不调用破坏者不是最干净的方法,而是最终结果将是相同的。
当一个进程终止(通过exit
或abort
或仅通过Segfaulting或其他原因),句柄(内核对象,文件等)将关闭,并且与程序地址空间相关联的内存由操作系统回收。
也没有太多其他内容,因为当您致电exit
或abort
时,您基本上是要求程序终止(这些功能永远不会返回!),因此您确实无法期望此后发生任何事情。p>请注意,在main
之前注册要调用Init
的函数是非标准的东西,但是您可以通过在全局中使用构造函数来获得相同的效果。