在C++中使用exitquestion.答案是这样的,主要是因为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(重点矿井):

exit函数导致normal程序终止.

该标准在7.22.4.4/p4中还规定:

接下来,所有开放的溪流都有unwritten buffered data are flushed

也值得一看7.21.3/p5 Files:

如果main函数返回到其原始调用方,或者如果exit 调用函数,all open files are closed(因此所有输出 流被转储清除)在节目终止之前.通往的其他路径 诸如调用abort函数的程序终止不需要 正确关闭所有文件.

然而,正如下面的注释中所提到的,您不能假设它将涵盖其他resource个版本,因此您可能需要求助于atexit(),并分别为它们的发布定义回调.事实上,正如它在7.22.4.2/p2The atexit function中所说,这正是atexit()要做的事情:

atexit函数将func指向的函数注册为 在正常程序终止时不带参数调用.

值得注意的是,C标准没有明确说明allocated storage duration(即malloc())的对象应该发生什么,因此要求您了解在特定实现中是如何实现的.对于现代的、面向主机的操作系统来说,系统很可能会处理它,但您仍然可能希望自己处理这个问题,以便让内存调试器(如Valgrind)静音.

C++相关问答推荐

代码打印正确输出次数过多(CS50)

单指针和空参数列表之间的函数指针兼容性

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

减法运算结果的平方的最快方法?

SDL 2.0-从数组渲染纹理

如果我释放其他内容,返回值就会出错

Rust FFI--如何用给出返回引用的迭代器包装C风格的迭代器?

MacOS下C++的无阻塞键盘阅读

为什么这个分配做得不好呢?

通过k&;r语法的c声明无效

为什么Linux无法映射这个PT_LOAD ELF段?

Linux分段故障(核心转储)

用于计算位数和的递归C函数

使用mmap为N整数分配内存

在列表中查找素数

在 C 中传递参数时出现整数溢出

使用邻接表创建图

C simd _m128 晶圆厂

如何确定 C 程序中的可用堆内存

如何在C中以0x格式打印十六进制值