在main之前退出程序是明确定义的行为吗?

时间:2012-11-03 23:48:52

标签: c++ exit main undefined-behavior

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

但是,如果在该主要代码中,该程序被告知要通过std::exitstd::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::abortmain,定义明确?是否存在任何未定义的行为?

1 个答案:

答案 0 :(得分:7)

简短的回答是:(几乎)没有后果。如果你意外地调用exit,可能不会调用某些析构函数,但这几乎就是它 通常,不调用析构函数不是最简洁的方法,但最终结果将是相同的。

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

也没有太多其他内容,因为当你调用exitabort时,你基本上要求程序终止(这些函数永远不会返回!)所以你真的不能期待之后发生任何事情。

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