在先前关闭的文件句柄上的 fclose() 上出现双重释放错误
Double free error on fclose() on previously closed file handle
我有一个类,其中包含指向打开的文件的文件句柄fHandle
。现在,它可以由多个例程中的任何一个关闭,并且基于程序的动态运行。
为了确保文件确实已关闭,我在析构函数中放置了简单的片段:if(fHandle!=NULL) fclose(fHandle);
.事实证明,如果其中一个例程之前关闭了此文件,则运行析构函数代码段会导致双重释放操作,并且我收到**glib detected**
错误消息。
如何确保我不关闭之前已关闭的文件句柄(除了进行NULL
检查)?
你说你试过:
if(fHandle!=NULL) fclose(fHandle);
为了避免双重fclose()
,只需将fHandle
设置为NULL
您可以在该句柄上调用fclose
的其他任何位置,因此析构函数中的上述代码将无法通过条件测试。
fclose 不会将 fhandle 设置为 NULL。因此,在调用 fclose 后,如果将句柄设置为 NULL 显式,它应该可以解决您的问题。
您的代码应如下所示:
if(NULL != fhandle)
{
fclose(fhandle);
fhandle = NULL;
}
注意:如果从多个线程调用调用 close 的函数,则此解决方案将不起作用。
这是
C还是C++。对于后一个问题,一个简单的解决方法是使用单独的标志来检查文件是否已关闭?像这样的东西
void CloseFile(){
if(flag ==0){
fclose(fHandle);
flag =1;
}
}
如果这是针对 c++,则可以将文件句柄封装在类中,并使用 RAII 通过在类的析构函数中添加该调用来自动调用 close 一次。如果你想这样做,你也可以(不推荐)不做RAII,而只是将标志封装在同一类中,并手动调用close
。
相关文章:
- 释放错误后堆使用
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 使用全局声明的向量时,C++双重释放错误/损坏
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 错误:"释放后使用包装器对象 (WRAPPER_ESCAPE)"
- 释放动态内存时C++错误
- 双重释放或损坏(输出)和中止(核心转储)错误
- AddressSanitizer 将 std::vector<T>::p ush_back 标识为释放后堆使用错误的原因
- 如何修复对象在释放后可能修改的malloc错误
- 错误:释放指针未分配在矢量模板类C 中
- 在函数内部错误定位后,从函数中释放返回的指针会导致芯片崩溃
- 双重释放或损坏错误(找不到错误?
- 删除指针时,未分配被释放的 C++ 指针错误
- 对于我的类函数,我得到双重释放或损坏错误
- 删除[]是否可以与通用数组正常使用?如果是这样,为什么使用std :: vector ::擦除它会导致释放内存的错误
- 为什么会出现错误:未分配正在释放的指针
- 循环链表的内存错误:未分配正在释放的指针
- C++复制构造函数上的双重释放错误
- C ++对象给了我一个错误:未分配正在释放的指针
- malloc: 对象 0x00 的 *** 错误:未分配正在释放的指针