【问题标题】:Crash while freeing memory释放内存时崩溃
【发布时间】:2012-01-13 05:13:35
【问题描述】:

我有一个用于修改 pdf 文件内容的应用程序。完成所需的更改后,我保存文件并退出应用程序。在此过程中,我想清除已分配给 pdf 文件的内存。代码如下:

    for (i32 i = 0; i < job_state->PDF_IList_len; i++) {
        if(IList[i].PIL_ImageData.PDH_DataPtr.PDH_PathName)
            free (IList[i].PIL_ImageData.PDH_DataPtr.PDH_PathName);
        if(IList[i].PIL_DependentImages)
            free (IList[i].PIL_DependentImages);
    }
    job_state->PDF_ImageList = NULL;
    job_state->PDF_context = NULL;
    free (IList);

job_structure 是保存文件信息的数据结构。 PDH_Pathname 是存储 pdf 详细信息的临时目录。

我的应用程序总是崩溃

free (IList[i].PIL_ImageData.PDH_DataPtr.PDH_PathName);

我注意到,每当它崩溃时,无法评估免费(IList[i].PIL_ImageData.PDH_DataPtr.PDH_PathName) 的值(调试器就是这么说的)。

如果注释掉 for 循环,则不会观察到崩溃。请让我知道可能是什么问题。

【问题讨论】:

  • 您可以发布您分配这些资源的位置和次数:/
  • 你标记了这个 C++,但代码调用了free :(
  • 对不起..这部分代码在C语言中
  • 此资源仅在使用该文件启动应用程序时被分配一次。关键是文件大小小于 2048mMB 时它不会崩溃。
  • mallocfree 是完全有效的 C++ 代码,尽管在可能的情况下首选 newdelete 肯定有很好的论据。

标签: c crash


【解决方案1】:

鉴于您显示的代码,无法说出根本原因,因为:

  • 您的代码没有显示如何在错误指针上完成分配。
  • 它也没有显示所有(可能很多地方)所述指针的使用位置。

第二个有点棘手,因为指针可能已经传递到 n 个控制路径,在那里它可能再次成为 freed 或被损坏,并且可以理解的是,不可能在此处提供所有这些作为问题。

鉴于上述情况,您最好的选择是在 Unix/Linux 系统上使用像 Valgrind 或在 Windows 上使用 Rational Purify 这样的内存分析工具。一旦您使用这些运行您的应用程序,它们就会准确地指出问题的根本原因。

【讨论】:

    【解决方案2】:

    除了 Als 对使用 valgrind 的回答之外,在释放它们之后,可能值得将指针设置为 NULL

    for (i32 i = 0; i < job_state->PDF_IList_len; i++) {
        free (IList[i].PIL_ImageData.PDH_DataPtr.PDH_PathName);
        IList[i].PIL_ImageData.PDH_DataPtr.PDH_PathName = NULL;
        free (IList[i].PIL_DependentImages);
        IList[i].PIL_ImageData.PDH_DataPtr.PDH_PathName = NULL;        
    }
    

    free() 不会设置指向NULL 的指针,它只会释放存储在那里的内存。由于您正在针对零测试指针的值以确定是否需要释放它,因此如果此代码被调用两次(或者如果 IList[] 指向到IList[]后面也遇到的结构。

    根据评论,我还删除了在免费之前对 NULL 的检查(正如 Joshua Green 指出的那样,free(NULL) 非常安全)。

    【讨论】:

    • 没有理由在释放指针之前针对 NULL 测试指针 -- free(NULL) 是 NOP。在free之后将其设置为NULL当然是最安全的策略。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多