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定义好的?这种未定义的行为是什么?
简短的回答是:(几乎)没有后果.如果你意外地打电话exit,有些析构函数可能不会被调用,但这就是它.
通常,不调用析构函数不是最简洁的方法,但最终结果将是相同的.
当进程终止时(通过exit或abort仅通过segfaulting或其他原因),句柄(内核对象,文件等)被关闭,并且与程序的地址空间相关联的内存由操作系统回收.
它没有其他的东西,因为当你打电话exit或者abort,你基本上要求程序终止(这些函数永远不会返回!)所以你真的不能指望其后发生任何事情.
注意,注册Init之前调用的函数main是非标准的东西,但是通过在全局中使用构造函数可以获得相同的效果.