首页 > 解决方案 > 从读取之前关闭的文件中读取

问题描述

昨天我度过了一个不眠之夜,试图找出我的测试用例中的一个错误。我的界面看起来像这样:

image read_image(FILE *file) {
  if (file == nullptr) {
    //throw exception 
  }
  //call ftell and fread on the file
  //but not fclose
  ...
  //return an image
}

结果我的一个测试用例测试了我的代码是否可以处理从第一次打开的文件中读取(所以文件指针不是nullptr),但在我将它传递给我的函数之前关闭,如下所示:

FILE *img_file = fopen("existing_image.png", "r");
REQUIRE(img_file != nullptr); //this passes!
fclose(img_file);
auto my_image = image_read(file);

//... then somewhere down in completely
//unrelated test cases I get segfaults,
//double free errors and the like

然后我花了几个小时试图追踪段错误,在我的代码中完全不相关的部分进行双重释放,直到我删除了那个特定的测试用例。这似乎解决了它。

我的问题是:

  1. 我知道在关闭的文件上调用fread/ftell是一个愚蠢的想法,但它真的会导致这种内存损坏吗?我环顾四周,例如 cppreference 但从未明确指定传递封闭流是未定义的行为......
  2. 有没有办法在读取文件之前找出文件是否已关闭?(我看了SO,但答案似乎:没有。)

附加信息

我正在使用 C++17 和 gcc 9.3.0 进行编译。我必须处理的原因FILE *是因为我从外部 C API 接收这些指针。

标签: c++fopenfreadfclose

解决方案


是的,它可能会导致内存损坏,因为FILE *可能已经分配了内存。可能使用malloc.

如果您在使用malloc后尝试使用指针,您的程序会发生free什么?

是的,一切都崩溃了。不要那样做。


推荐阅读