c++ - 从读取之前关闭的文件中读取
问题描述
昨天我度过了一个不眠之夜,试图找出我的测试用例中的一个错误。我的界面看起来像这样:
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
然后我花了几个小时试图追踪段错误,在我的代码中完全不相关的部分进行双重释放,直到我删除了那个特定的测试用例。这似乎解决了它。
我的问题是:
- 我知道在关闭的文件上调用
fread
/ftell
是一个愚蠢的想法,但它真的会导致这种内存损坏吗?我环顾四周,例如 cppreference 但从未明确指定传递封闭流是未定义的行为...... - 有没有办法在读取文件之前找出文件是否已关闭?(我看了SO,但答案似乎:没有。)
附加信息
我正在使用 C++17 和 gcc 9.3.0 进行编译。我必须处理的原因FILE *
是因为我从外部 C API 接收这些指针。
解决方案
是的,它可能会导致内存损坏,因为FILE *
可能已经分配了内存。可能使用malloc
.
如果您在使用malloc
后尝试使用指针,您的程序会发生free
什么?
是的,一切都崩溃了。不要那样做。
推荐阅读
- android - 是否可以使用 Android 中的指纹传感器从网站进行身份验证?
- scala - 如何在 Scala 中以编程方式启动独立的 Spark master
- c# - 具有服务 api 和 azure 部署的 asp.net 网站
- java - CRUD -> 添加错误信息
- styles - 使用 PrestaShop 1.7.3.2 创建子主题
- javascript - 如何在 JavaScript 中删除或替换 ´?
- ios - CloudKit fetch 操作返回旧数据集
- dart - 在 Flutter 中,Dependencies 必须指定版本号?
- log4j - 删除 Log4j 并使用 Logback
- vba - 根据条件创建新的单元格值