自从我处理 C++ 以来已经有好几年了,所以请耐心等待...
我的程序中有内存泄漏,导致运行时错误。这会导致错误吗?
我有一个全局变量FILE *fp;
在回调函数中,我有:
fp = fopen(filen,"w");
// do some writing
fclose(fp);
使用相同的指针 (fp) 重复此过程数次。使用相同的文件指针有问题吗?fclose() 会自动为我释放内存,还是我需要手动删除它?如果我正在编写大量文本,是否有任何限制可能导致运行时错误?
谢谢!
自从我处理 C++ 以来已经有好几年了,所以请耐心等待...
我的程序中有内存泄漏,导致运行时错误。这会导致错误吗?
我有一个全局变量FILE *fp;
在回调函数中,我有:
fp = fopen(filen,"w");
// do some writing
fclose(fp);
使用相同的指针 (fp) 重复此过程数次。使用相同的文件指针有问题吗?fclose() 会自动为我释放内存,还是我需要手动删除它?如果我正在编写大量文本,是否有任何限制可能导致运行时错误?
谢谢!
是的,fclose
释放与FILE *
. 根据经验,仅使用free
分配给 的内容malloc
,并且仅使用delete
分配给的内容new
。
而且你永远不会“重用”同一个指针:调用fopen
将返回一个新的FILE *
.
顺便说一句,既然您正在使用 C++,请考虑查看fstream
. 它将为您处理资源管理。
这种方法不会导致任何内存泄漏,只要在下一次调用 之前fopen
总是跟在 a之后。fclose
fopen
但是,如果这确实是正在发生的事情,我会质疑对全局变量的需求。总体而言,将其设为本地并将其传递给需要输出信息的函数会更安全。
听起来你做的事情完全正确——fclose
应该扭转任何事情fopen
,包括释放它可能分配的任何资源。
多个线程命中同一个全局可能会导致在其中一个线程关闭文件后出现的问题。
下次打开文件并更改文件指针时不会看到它发生。
关闭文件只会关闭创建的文件句柄中的 1 个,从而导致文件句柄泄漏,并且对该文件的任何进一步写入都将失败,并且同一句柄上的后续关闭文件尝试再次关闭它可能会崩溃,如果它没有已经发生写入文件。