2011-06-03 94 views
2

從我處理C++已經有好幾年了,所以忍受着我......重新使用文件指針會導致內存泄漏嗎?

我的程序中有一個內存泄漏,導致運行時錯誤。這可能導致錯誤?

我有一個全局變量FILE *fp;

在回調功能可按,我有:

fp = fopen(filen,"w"); 
// do some writing 
fclose(fp); 

該過程以相同的指針(FP)重複數次。是否使用相同的文件指針有問題?請問fclose()會自動爲我釋放內存,還是我需要手動刪除它?如果我寫大量文本,是否有任何限制可能導致運行時錯誤?

謝謝!

+1

正如你所說,它是一個全球性的,我懷疑你有未初始化變量的問題。如果您在實際使用指針進行讀取/寫入的代碼中檢查「if(fp!= NULL)」時,總是將FILE設置爲NULL。另外,當你嘗試使用這個指針時,它可能會導致文件打開失敗並返回'NULL',它也會導致崩潰。 – Rookie 2011-06-03 19:20:08

回答

3

只要在下一個fopen調用之前,fopen後面總是後跟fclose,此方法不會導致任何內存泄漏。

但是,如果這確實是發生了什麼,我會質疑需要一個全局變量。總體而言,將其設置爲本地並將其傳遞給需要輸出信息的功能會更安全。

+0

謝謝。該程序是一個插件,所以我不知道是否可以向回調傳遞額外的參數。但是,在關閉之前,該文件將保持開放,通過回調的幾百次迭代,所以我不能將其作爲局部變量。 – Jeff 2011-06-03 19:10:14

+0

@Jeff:幾乎每個接受回調的函數都需要一個'void *'指針,所謂的「用戶數據」被傳回給你的函數。你的API是否也這樣做? – Xeo 2011-06-03 19:11:53

+0

@Xeo也許,我會研究它,謝謝! – Jeff 2011-06-03 19:24:53

4

是的,fclose會釋放與FILE *相關的所有資源。作爲一個經驗法則,只有使用free分配了malloc的內容,並且只使用delete分配了new

而且你永遠不會「重複使用」相同的指針:撥打fopen將返回一個新的FILE *

順便說一句,既然你在做C++,考慮看看fstream。它會爲你處理資源管理。

0

這聽起來像你正在做的事情完全正確 - fclose應該反轉任何fopen,包括釋放它可能分配的任何資源。

0

多個線程擊中相同的全局可能會導致在其中一個線程關閉文件後出現的問題。

隨後打開文件並更改文件指針在發生時不會被看到。

關閉文件只會關閉創建的文件句柄中的一個,導致文件句柄泄漏,並且對文件的任何進一步寫入操作都會失敗,並且第二次嘗試關閉它的同一個句柄上的後續關閉文件可能會崩潰if它尚未發生寫入該文件。