在MiniZip中泄漏

时间:2010-12-02 15:23:48

标签: iphone c memory-leaks

我正在使用MiniZip解压缩iPhone项目中的文件。一切正常,但我在这行的MiniZip代码中泄漏了仪器:

unzip.c 第493行

s=(unz_s*)ALLOC(sizeof(unz_s));
*s=us;
unzGoToFirstFile((unzFile)s);
return (unzFile)s;

我知道分配了ALLOC的var被返回而不是被释放。在objective-C中,我只是做一个自动释放,但我怎么能在普通的C中实现呢?

谢谢, 文森特。

4 个答案:

答案 0 :(得分:2)

该方法的调用者负责s,并且当不再需要它来避免内存泄漏时,必须free()。这是C中的惯例。

您必须绑定第三方GC库,可能类似于Hans Boehm's GC for C/C++。但是,我的建议是在你自己适当时释放内存。你会遇到那种麻烦。

答案 1 :(得分:1)

free(s);

(填充到15个字符)

答案 2 :(得分:1)

unzOpen()用于分配句柄并将其返回给调用者。获得该处理后,您可以对此zip存档进行操作(即搜索文件,从存档中提取文件,......)。完成所有操作后,您必须通过调用为您解除分配的unzClose来显式关闭zip-archive。

以下是从存档中提取特定文件的示例:

unzFile hArchive;
unsigned char buffer[1024];
hArchive = unzOpen("abc.zip");
if (hArchive != NULL) {
  if (unzLocateFile(hArchiveFile, "example.txt", 0) == UNZ_OK) {
    if (unzOpenCurrentFile(hArchiveFile) == UNZ_OK) {
      while (unzReadCurrentFile(hArchiveFile,buffer,sizeof(buffer)) > 0) {
        /* write buffer to another file / to stdout / ... */
      }
      unzCloseCurrentFile((unzFile) *hArchiveFile);
    }
  }
}
unzClose(hArchive);

请参阅http://www.winimage.com/zLibDll/minizip.html了解详情。

答案 3 :(得分:0)

无论这是什么功能,问题都不在于该功能。它应该返回一个已分配的对象,而不是在返回之前无用的分配和释放。问题在于您使用库。你永远不会调用函数来释放你从调用这个函数中获得的指针。