2010-12-02 12 views
1

私はiPhoneプロジェクトのファイルを解凍するのにMiniZipを使用しています。すべてが正常に動作しますが、私はこの行のMiniZipコード内の機器のリークを取得する:私はALLOCで割り当てVARが返され、割り当て解除されていないことを理解しLeak in MiniZip

unzip.c ライン493

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

。目標では、Cは単に自動解放を行いますが、どうすればCでそれを達成できますか?

ありがとう、 Vincent。

答えて

2

そのメソッドの呼び出し側はsの責任であり、もはやメモリリークを回避するために必要とされるときにそれをfree()はなりません。これはC言語の規約です。

サードパーティのGCライブラリには、Hans Boehm's GC for C/C++のようなものが含まれていなければなりません。しかし、私の提案は、それがあなた自身で適切であるときだけ、メモリを解放することです。あなたはそのような面倒を少なくします。

0

これがどのような機能であっても、その機能に問題はありません。割り当てられたオブジェクトを返すことになっています。返す前に無駄に割り当てたり解放したりするわけではありません。問題は、あなたのライブラリの使用にあります。この関数を呼び出すことで得たポインタを解放する関数を呼び出すことは決してありません。

1

unzOpen()は、ハンドルを呼び出し側に割り当てて返すことを意図しています。そのハンドルを手に入れたら、このzipアーカイブ(ファイルの検索、アーカイブからのファイルの膨張など)で操作できます。すべての操作が終了したら、あなたのためにsを割り当て解除するunzCloseを呼び出して、明示的に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を参照してください。