几百次运行后 fopen() 内存泄漏
Posted
技术标签:
【中文标题】几百次运行后 fopen() 内存泄漏【英文标题】:fopen() memory leak after few hundred runs 【发布时间】:2015-11-13 16:26:11 【问题描述】:我正在编写一个应用程序,它应该从文件中读取某些级别的一些数据。当我运行代码(包括 fopen() 和 fclose())超过几百次时,我收到了错误消息(我知道这意味着它无法打开文件):
调试断言失败! 程序: D:\blahblah 文件:f:\dd\vctools\crt\crtwin32\stdio\fgets.c 线路:57 表达式:(string!=NULL)
你能帮我理解为什么它会在超过 300 时间后破裂吗?
Func_Main(char * filePath, ...)
for(int i=0;i<1000;i++)
Func_1(filePath);
....
....
Func_1(char* filepath)
char buffer[1024];
FILE * file= NULL;
file = fopen(filepath, "r");
while(fgets(buffer, sizeof(buffer), file))
\\ do something
fclose(file);
【问题讨论】:
因为fopen()
失败,并且您的代码没有按应有的方式检查返回值?
@EOF 看起来错误说它无法打开文件!你的意思是它应该是 fgets()?
奇怪:你得到一个 filepath
作为参数,但你打开一个静态文件名。无论检查fopen
是否成功都是必须添加的。
@EOF fopen
我认为正在检查返回,请参阅while
循环条件。
否,fgets
返回已检查。但是如果在未打开的FILE*
上调用fgets
会发生什么?可能是 UB 或错误。
【参考方案1】:
您应该检查fopen
的返回值。如果打开文件失败,它将返回一个空指针。
它会失败,因为\
是一个转义字符,在文件名字符串中使用\\
。
【讨论】:
【参考方案2】:我看到的问题:
您永远不会使用传递给Func_1
的参数。您改为使用硬编码路径。
硬编码路径有错误。您没有转义硬编码路径中的反斜杠。应该是:
file = fopen("c:\\blahblah.txt", "r");
^^
您没有检查fopen
是否成功。你假设它是成功的。使用:
file = fopen("c:\\blahblah.txt", "r");
if ( file == NULL )
// Deal with the error.
perror("Unable to open the file");
更新,在 OP 编辑问题后
前两点可以忽略。最后一点还需要考虑。
file = fopen(filepath, "r");
if ( file == NULL )
// Deal with the error.
perror("Unable to open the file");
【讨论】:
对不起,我编辑了其实我已经使用了参数! 你确定你没有在现在设置参数的地方误用 \ 吗?以上是关于几百次运行后 fopen() 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章