【发布时间】:2015-07-19 12:21:59
【问题描述】:
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);
}
【问题讨论】:
-
“不会调用对象的析构函数”——这并不完全正确(参见:cplusplus.com/reference/cstdlib/exit)。您正在考虑 quick_exit(请参阅:cplusplus.com/reference/cstdlib/quick_exit/?kw=quick_exit)。
-
您可能还有一些操作系统特定的问题,例如
SIGTERM信号在 POSIX 和 Linux 上的 传统 角色.... 表现良好的服务器有望很好地处理它。你应该避免使用SIGKILL(即尝试kill -TERM然后kill -QUIT,然后才使用kill -KILL作为系统管理员) -
在 Stack Overflow 推出近 7 年后,这怎么不是重复的?
-
@PeterMortensen:这是令人惊讶,但我不知道这个重复的好选择。高票数Use of
exit()function 并不密切(高票数令人惊讶——这不是一个好问题)。 Why should I not use exit() function in C? 如果有这个问题的答案,那将是一个很好的候选人。它没有;作为副本的反向关闭是合适的 - 我已经做到了。 -
我不确定你想在错误情况下使用'printf'。该函数使用缓冲区,但如果您有内存损坏,这些缓冲区可能不好。您可能只想使用 'write(2, "ERROR: ", 7);写(2,消息,strlen(消息));
标签: c