C++ 未定义的行为fopen、fclose
以下代码会导致未定义的行为吗C++ 未定义的行为fopen、fclose,c++,c,file,fopen,fclose,C++,C,File,Fopen,Fclose,以下代码会导致未定义的行为吗 FILE *fp; fopen_s(&fp, "abc.bin", "rb"); fclose(fp); fclose(fp); // accidentally closed an already closed file. 我知道对已经释放的数组调用free会导致UB。因此我问 引用自曼恩fclose: 如果流参数是非法指针,或者是已传递给先前调用fclose()的描述符,则fclose()的行为未定义 是的,这是未定义的行为。这当然是未定义的行为。在难以
FILE *fp;
fopen_s(&fp, "abc.bin", "rb");
fclose(fp);
fclose(fp); // accidentally closed an already closed file.
我知道对已经释放的数组调用free会导致UB。因此我问 引用自
曼恩fclose
:
如果流参数是非法指针,或者是已传递给先前调用fclose()的描述符,则fclose()的行为未定义
是的,这是未定义的行为。这当然是未定义的行为。在难以跟踪的复杂情况下,就像
free()
一样,如果在声明点将指针设置为NULL
,在关闭或释放后,可以在fclose()
或free()之前检查它
调用以避免很多悲伤。@WeatherVane:但不幸的是,与free
不同的是,使用NULL
指针调用fclose
并没有很好的定义。我建议在free
之前“检查”NULL
是件坏事。在调用fclose
之前检查NULL
绝对是一件好事。另请参见duplicate@MatsPetersson如果(!nullptr==fp)fclose(fp)如何代码>?POSIX还说UB:同意。一个实现可以总是new/malloc
在fopen(
)中的文件和在fclose()
中删除/释放它,或者它可以使用私有缓存,这两者都是合法的。调用方在将文件*
指针传递到fclose()
后,不应对其有效性做出任何假设,只需将其设为NULL并移动它即可。为什么会显示stream参数?不使用流here@ShafikYaghmourISO C11草案N1570,7.21.3 PAR。4:关闭关联文件(包括标准文本流)后,指向文件对象的指针的值是不确定的。