2012-10-10 37 views
0

我有一個包含指向打開文件的文件句柄fHandle的類。現在,它可以被多個例程中的任何一個關閉,並且基於該程序的動態運行。以前關閉的文件句柄上的fclose()的雙倍釋放錯誤

爲了確保文件確實關閉,我把簡單的代碼片段放在我的析構函數中:if(fHandle!=NULL) fclose(fHandle);。事實證明,如果其中一個例程之前已經關閉了這個文件,那麼運行析構函數代碼片斷會導致雙重空閒操作,並且我得到了**glib detected**錯誤消息。

如何確保我不關閉先前已關閉的文件句柄(除了放入NULL檢查)?

+2

如果你使用類又名C++,你應該這樣標記它 – jozefg

回答

1

你說你已經嘗試:

if(fHandle!=NULL) fclose(fHandle); 

爲了避免雙重fclose(),只需設置fHandleNULL徘徊無論否則你可能會在該句柄調用fclose,所以在析構函數上面的代碼將不會通過條件測試....

0

這是具體的C或C++。一個簡單的修復你的後期問題使用單獨的標誌來檢查文件是否關閉?這樣

void CloseFile(){ 
    if(flag ==0){ 
    fclose(fHandle); 
     flag =1; 
    } 
} 

東西,如果這是C++可以封裝在類中的文件句柄,並使用RAII通過添加在類的析構函數的調用會自動調用close只有一次。你也可以(不推薦)不使用RAII,如果你想要這樣做,只需要將該標誌封裝在同一個類中,然後手動調用close

1

fclose不會將fhandle設置爲NULL。所以,在調用fclose之後,如果您將fhandle設置爲NULL,它應該可以解決您的問題。

你的代碼應該是象下面這樣:

if(NULL != fhandle) 
{ 
    fclose(fhandle); 
    fhandle = NULL; 
} 

注意:如果你的函數調用結束之時從多個線程調用此解決方案將無法工作。

相關問題