gpt4 book ai didi

c++ - 从读取之前关闭的文件中读取

转载 作者:行者123 更新时间:2023-12-03 06:57:10 25 4
gpt4 key购买 nike

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

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 接收这些指针。

最佳答案

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

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

是的,一切都坏了。不要这样做。

关于c++ - 从读取之前关闭的文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64167417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com