0

ZipArchiveライブラリを使用していますが、メモリリークが発生しているようです。これを修正する方法がわかりません。Cで書かれていて、なじみがありません。私の質問は-行s=(unz_s *)ALLOC(sizeof(unz_s));を自動解放することは可能ですか?このシナリオのObjective-Cのように?

extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def)
        const char *path;
        zlib_filefunc_def* pzlib_filefunc_def;
    {

        // ...

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

わかりやすくするために、リークの場所を画面で確認します。

http://ziparchive.googlecode.com/issues/attachment?aid=-5463964192517894688&name=Screen+shot+2010-08-20+at+8.12.58+PM.png&token=8c66aa58a4826b99ba157903fbae83bb&inline=1

誰かが私がこれを修正する方法に光を当てることができますか?ありがとう。

4

2 に答える 2

2

私は同じ問題に直面し、いくつかのブログを読んで解決しました。
オブジェクトを解放する前に、ZipArchiveオブジェクトを単純 に閉じる
ようです。
[ZipObj UnzipCloseFile];

于 2011-07-15T04:56:04.030 に答える
0

いいえ、自動リリースすることはできません。自動リリースは、Objective-Cオブジェクトでのみ使用できます。したがって、2つのオプションがあります。

  1. を使用して自分でメモリを解放しますfree()
  2. s物をNSDatausingにラップします。dataWithBytesNoCopy:length:これにより、割り当てられたデータの所有権が取得され、NSDataオブジェクトの割り当てが解除されたときに解放されます。

オプション2は次のようになります。

unz_s * s = unzOpen2(...);
NSData * boxedS = [NSData dataWithBytesNoCopy:s length:sizeof(unz_s)];

その後、boxedS破壊されると、それも解放sされます。

于 2010-09-08T18:02:56.403 に答える