在先前关闭的文件句柄上的 fclose() 上出现双重释放错误

Double free error on fclose() on previously closed file handle

本文关键字:错误 释放 文件句柄 fclose 在先前      更新时间:2023-10-16

我有一个类,其中包含指向打开的文件的文件句柄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