gpt4 book ai didi

c - 我们应该在 C 中使用 exit() 吗?

转载 作者:太空狗 更新时间:2023-10-29 16:15:46 25 4
gpt4 key购买 nike

question关于在 C++ 中使用 exit。答案讨论了这不是一个好主意,主要是因为 RAII,例如,如果 exit 在代码中的某处被调用,对象的析构函数将不会被调用,因此,如果析构函数是为了写数据到文件,这不会发生,因为没有调用析构函数。

我对 C 中的这种情况很感兴趣。类似的问题是否也适用于 C?我想因为在 C 中我们不使用构造函数/析构函数,所以在 C 中情况可能会有所不同。那么在 C 中使用 exit 可以吗?例如,我看到有时在 C 中使用以下函数:

void die(const char *message)
{
if(errno) {
perror(message);
} else {
printf("ERROR: %s\n", message);
}

exit(1);
}

最佳答案

C 中的 exit() 函数被认为是“正常”退出,而不是 abort()

来自 C11 (N1570) 7.22.4.4/p2 退出函数(强调我的):

The exit function causes normal program termination to occur.

该标准还在 7.22.4.4/p4 中指出:

Next, all open streams with unwritten buffered data are flushed, all open streams are closed, and all files created by the tmpfile function are removed.

7.21.3/p5 文件也值得一看:

If the main function returns to its original caller, or if the exit function is called, all open files are closed (hence all output streams are flushed) before program termination. Other paths to program termination, such as calling the abort function, need not close all files properly.

但是,正如下面评论中提到的,您不能假设它会涵盖所有其他资源,因此您可能需要求助于 atexit() 并定义回调为他们单独释放。事实上,这正是 atexit() 的目的,正如它在 7.22.4.2/p2 The atexit 函数中所说:

The atexit function registers the function pointed to by func, to be called without arguments at normal program termination.

值得注意的是,C 标准并未准确说明分配的存储持续时间(即 malloc())的对象应该发生什么,因此需要您了解它是如何发生的是在特定的实现上完成的。对于现代的、面向主机的操作系统,系统很可能会处理它,但您仍然可能希望自己处理它,以使内存调试器静音,例如 Valgrind。 .

关于c - 我们应该在 C 中使用 exit() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31501142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com