2010-12-02 77 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進一步的信息。