我有一个包含fHandle
指向打开文件的文件句柄的类。现在,它可以被多个例程中的任何一个关闭,并且基于程序的动态运行。
为确保文件确实已关闭,我将简单的代码段放入我的析构函数中:if(fHandle!=NULL) fclose(fHandle);
. 事实证明,如果其中一个例程之前关闭了这个文件,那么运行析构函数片段会导致双重释放操作,我会收到**glib detected**
错误消息。
如何确保不关闭先前已关闭的文件句柄(除了放置NULL
检查)?
fclose 不会将 fhandle 设置为 NULL。因此,如果您将 fhandle 显式设置为 NULL,则在调用 fclose 后,它应该可以解决您的问题。
您的代码应如下所示:
if(NULL != fhandle)
{
fclose(fhandle);
fhandle = NULL;
}
注意:如果您的调用 close 的函数是从多个线程调用的,则此解决方案将不起作用。
你说你试过:
if(fHandle!=NULL) fclose(fHandle);
为避免出现 double fclose()
,只需将其设置fHandle
为NULL
您可以fclose
在该句柄上调用的任何其他位置,因此析构函数中的上述代码不会通过条件测试......
这具体是 C 还是 C++。后一个问题的一个简单解决方法是使用单独的标志来检查文件是否关闭?像这样的东西
void CloseFile(){
if(flag ==0){
fclose(fHandle);
flag =1;
}
}
如果这是针对 c++ 的,您可以将文件句柄封装在一个类中,并使用RAII通过在类的析构函数中添加该调用来自动调用一次关闭。如果您想这样做,您也可以(不推荐)不做 RAII 并且仅将标志封装在同一个类中,然后close
手动调用。