在主之前退出程序是明确的行为吗?



绝对可以在调用main之前执行代码,如此问题中的许多示例所示。

但是,如果在该预先代码中,该程序被告知通过std::exitstd::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::exitstd::abort的任何一种行为,定义明确吗?这种未定义的行为中有什么吗?

简短的答案是:几乎没有后果。如果您出乎意料地调用exit,则可能不会调用某些破坏者,但这几乎就是这样。
通常,不调用破坏者不是最干净的方法,而是最终结果将是相同的。

当一个进程终止(通过exitabort或仅通过Segfaulting或其他原因),句柄(内核对象,文件等)将关闭,并且与程序地址空间相关联的内存由操作系统回收。

也没有太多其他内容,因为当您致电exitabort时,您基本上是要求程序终止(这些功能永远不会返回!),因此您确实无法期望此后发生任何事情。p>请注意,在main之前注册要调用Init的函数是非标准的东西,但是您可以通过在全局中使用构造函数来获得相同的效果。

相关内容

  • 没有找到相关文章

最新更新