在释放内存时崩溃

时间:2012-01-13 05:13:35

标签: c crash

我有一个用于修改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循环被注释掉,则没有观察到崩溃。请告诉我可能出现的问题。

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

除了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的指针,它只释放存储在那里的内存。由于您正在测试指针的值为零以确定是否需要释放它,因此如果将此代码调用两次(或者如果NULL内的任何内容,则不将指针设置为IList[]可能会导致双重释放1}}指向稍后在IList[]中遇到的结构。

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