【问题标题】:Does re-use of file pointers cause a memory leak?重用文件指针会导致内存泄漏吗?
【发布时间】:2023-03-06 10:17:01
【问题描述】:

我接触 C++ 已经好几年了,所以请耐心等待......

我的程序中存在内存泄漏,导致运行时错误。这会导致错误吗?

我有一个全局变量FILE *fp;

在回调函数中,我有:

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

这个过程用同一个指针(fp)重复多次。使用相同的文件指针有问题吗? fclose() 会自动为我释放内存,还是我需要手动删除它?如果我正在编写大量文本,是否有任何限制可能导致运行时错误?

谢谢!

【问题讨论】:

  • 正如您所说的那样,它是一个全局变量,我怀疑您遇到了未初始化变量的问题。始终将 FILE 设置为NULL,以防您在实际使用指针进行读/写时在代码中的某处检查if(fp != NULL)。另外,也有可能是文件打开失败返回NULL,当你尝试使用这个指针也会导致崩溃。

标签: c++ file-io memory-leaks fopen fclose


【解决方案1】:

是的,fclose 释放与FILE * 关联的所有资源。根据经验,仅对使用malloc 分配的内容使用free,仅对使用new 分配的内容使用delete

而且您永远不会“重复使用”同一个指针:调用 fopen 将返回一个新的 FILE *

顺便说一句,既然您正在使用 C++,请考虑查看 fstream。它将为您处理资源管理。

【讨论】:

    【解决方案2】:

    只要在下一个fopen 调用之前始终紧跟fclose,这种方法就不会导致任何内存泄漏。

    但是,如果确实发生了这种情况,我会质疑是否需要全局变量。总体而言,将其设为本地并将其传递给需要输出信息的函数会更安全。

    【讨论】:

    • 谢谢。该程序是一个插件,所以我不知道我是否可以将额外的参数传递给回调。但是,该文件将在关闭之前通过数百次回调迭代保持打开状态,因此我不能将其设为局部变量。
    • @Jeff:几乎每个接受回调的函数也接受一个void* 指针,即所谓的“用户数据”,它被传回你的函数。你的 API 也这样做吗?
    • 就此而言,总体而言使用 iostream 更安全。
    【解决方案3】:

    听起来你做事完全正确——fclose 应该反转 fopen 所做的一切,包括释放它可能分配的任何资源。

    【讨论】:

      【解决方案4】:

      多个线程访问同一个全局可能会导致在其中一个线程关闭文件后出现的问题。

      随后打开文件并更改文件指针时不会看到。

      关闭文件只会关闭已创建的文件句柄中的 1 个,从而导致文件句柄泄漏,并且对该文件的任何进一步写入都将失败,并且同一句柄上的后续关闭文件再次尝试关闭它可能会崩溃,如果它尚未写入文件。

      【讨论】:

        猜你喜欢
        • 2012-08-10
        • 2021-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-23
        • 2021-09-25
        • 2014-12-08
        • 1970-01-01
        相关资源
        最近更新 更多