【发布时间】:2015-04-01 20:04:19
【问题描述】:
以下代码会导致未定义的行为吗?
FILE *fp;
fopen_s(&fp, "abc.bin", "rb");
fclose(fp);
fclose(fp); // accidentally closed an already closed file.
我知道在已经释放的数组上调用 free 会导致 UB。因此我问。
【问题讨论】:
-
这当然是未定义的行为。
-
在难以跟踪的复杂情况下,就像
free(),如果在声明点将指针设置为NULL,然后在关闭或释放后,您可以在fclose()或free()调用之前检查它以节省很多悲伤。 -
@WeatherVane:但不幸的是,与
free不同的是,使用NULL指针调用fclose的定义并不明确。我建议在free之前“检查”NULL是一件坏事。在调用fclose之前检查NULL绝对是一件好事。 -
另见 Fclose a file that is already fclose 看起来像重复
-
@MatsPetersson
if (!nullptr == fp) fclose(fp);怎么样?