2010-12-02 44 views
1

我正在使用MiniZip在iPhone项目中解压缩文件。一切工作正常,但我得到的仪器在MiniZip代码泄漏在这条线:在MiniZip中泄漏

unzip.c 线493

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

我了解,ALLOC分配的VAR返回并没有释放。在Objective-C中,我只是简单地做一个自动释放,但我怎样才能在普通的C中实现呢?

谢谢, 文森特。

回答

2

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

您必须绑定第三方GC库,可能类似于Hans Boehm's GC for C/C++。不过,我的建议是在适当的时候释放内存。你会以这种方式减少麻烦。

0

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

1

unzOpen()用于分配并返回句柄给调用者。获得该句柄后,您可以在此zip压缩文件中进行操作(即搜索文件,从压缩文件中压缩文件,...)。在所有操作完成后,您必须通过调用unzClose(s)来为您解除分配s,从而明确地关闭zip归档文件。

下面是一个例子,以提取从归档一个特定的文件:

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进一步的信息。