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