在 main 之前退出程序是明确定义的行为吗?
Posted
技术标签:
【中文标题】在 main 之前退出程序是明确定义的行为吗?【英文标题】:Is it well-defined behaviour to exit the program before main? 【发布时间】:2012-10-24 06:12:59 【问题描述】:绝对可以在调用main
之前执行代码,正如this question 中的许多示例所见。
但是,如果在那个 pre-main 代码中,程序被告知通过std::exit
或std::abort
退出怎么办?既然main
被定义为程序的开始,那么在开始之前退出会有什么后果呢?
在每个部分打印一些内容后,我得到以下结果:
格式:部分:output
Main:main
Init(在 main 之前调用):init
Exit(在内部设置 std::atexit
初始化):exiting
样本运行:
Init 被调用而不退出:
初始化 主返回 0
Init 调用 std::exit(0):
init返回 0
初始化调用 std::abort:
init使用 GCC 4.7.2 在 Windows 上崩溃并返回 3使用 VS11 时崩溃并打开通常的框在 LiveWorkSpace 上返回 0
Init 设置处理程序并调用 std::exit(0):
初始化 退出返回 0
Init 设置处理程序并调用 std::abort:
init与没有处理程序的处理相同
在搜索时,我看到了这个问题:Is there any way a C/C++ program can crash before main()?。但是,它没有回答我想知道的问题:是否有任何这种行为,在main
之前调用std::exit
或std::abort
,定义明确?是否有任何未定义的行为?
【问题讨论】:
如果您对结合测试的样本感兴趣,here's one。 【参考方案1】:简短的回答是:(几乎)没有后果。如果您意外调用exit
,可能不会调用某些析构函数,但仅此而已。
通常,不调用析构函数不是最干净的方法,但最终结果还是一样。
当进程终止时(通过exit
或abort
或仅仅通过段错误或其他原因),句柄(内核对象、文件等)被关闭,与程序地址空间相关的内存被回收由操作系统决定。
也没什么其他的了,因为当你调用exit
或abort
时,你基本上是在请求程序终止(这些函数永远不会返回!)所以你真的不能期待任何事情发生之后。
请注意,在 main
之前注册像 Init
这样的函数是非标准的,但您可以通过在全局中使用构造函数来获得相同的效果。
【讨论】:
由于未调用析构函数,缓冲写入可能无法写入exit
。
@JanDvorak:如果您将“缓冲”称为由 C 或 C++ 标准库(iostream 或 stdio)缓冲,那么是的。但同样,这正是您所要求的,因此不足为奇。毕竟,您是在说“仅此而已,继续杀了我吧!”。除非操作系统严重损坏,否则已被操作系统接受的缓冲写入将(应该)成功完成。以上是关于在 main 之前退出程序是明确定义的行为吗?的主要内容,如果未能解决你的问题,请参考以下文章