在 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::exitstd::abort 退出怎么办?既然main被定义为程序的开始,那么在开始之前退出会有什么后果呢?

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

格式:部分output

MainmainInit(在 main 之前调用)initExit(在内部设置 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::exitstd::abort,定义明确?是否有任何未定义的行为?

【问题讨论】:

如果您对结合测试的样本感兴趣,here's one。 【参考方案1】:

简短的回答是:(几乎)没有后果。如果您意外调用exit,可能不会调用某些析构函数,但仅此而已。 通常,不调用析构函数不是最干净的方法,但最终结果还是一样。

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

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

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

【讨论】:

由于未调用析构函数,缓冲写入可能无法写入exit @JanDvorak:如果您将“缓冲”称为由 C 或 C++ 标准库(iostream 或 stdio)缓冲,那么是的。但同样,这正是您所要求的,因此不足为奇。毕竟,您是在说“仅此而已,继续杀了我吧!”。除非操作系统严重损坏,否则已被操作系统接受的缓冲写入将(应该)成功完成。

以上是关于在 main 之前退出程序是明确定义的行为吗?的主要内容,如果未能解决你的问题,请参考以下文章

C 退出行为像返回吗? [复制]

我的程序在进入main()函数之前退出

C++程序进入main函数之前,退出main函数之后会做些啥?

深度剖析C语言的main函数!

干货 | 深度剖析C语言的main函数

为啥我的线程在“Main”中的任何内容可以运行之前就退出了?