2011-06-03 106 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它尚未发生写入该文件。