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

chr*_*ris 11 c++ program-entry-point exit undefined-behavior

main调用之前执行代码绝对是可能的,正如本问题中的许多示例所示.

但是,如果在该主要代码之前,程序被告知通过std::exit或退出std::abort?既然main被定义为程序的开始,那么在开始之前退出会产生什么后果?

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

格式:
部分:output

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



样品运行:

在不退出的情况下调用Init:

init
main
返回0

Init调用std :: exit(0):

init
返回0

Init调用std :: abort:

init
崩溃并在Windows上返回3,GCC 4.7.2
崩溃,并在LiveWorkSpace上显示VS11 返回0 的常用框

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

init
退出
返回0

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

如果没有处理程序,初始化
相同

在搜索时,我看到了这样一个问题:在main()之前,C/C++程序有什么方法可以崩溃吗?.但是,它没有回答我想知道的事情:这种行为是在调用之前std::exit还是std::abort以前main定义好的?这种未定义的行为是什么?

Dam*_*mon 7

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

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

它没有其他的东西,因为当你打电话exit或者abort,你基本上要求程序终止(这些函数永远不会返回!)所以你真的不能指望其后发生任何事情.

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

  • @JanDvorak:如果你在C或C++标准库(iostream或stdio)缓冲中引用"buffered",那么是的.但同样,这正是你所要求的,所以这并不奇怪.毕竟,你说"就是这样,现在继续杀了我!".除非操作系统严重损坏,否则操作系统已接受的缓冲写入将(应该)成功完成. (2认同)