проблема утечки памяти iPhone в ZipArchive lib - PullRequest
0 голосов
/ 08 сентября 2010

Я с благодарностью использую библиотеку 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

Кто-нибудь может пролить свет на то, как я могу это исправить? Спасибо.

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

Я столкнулся с той же проблемой и решил, прочитав некоторые блоги. кажется простым
закройте объект ZipArchive, прежде чем выдавать объект
, который выглядит как
[ZipObj UnzipCloseFile];

0 голосов
/ 08 сентября 2010

Нет, вы не можете автоматически выпустить его. Авто-релиз доступен только для объектов Objective-C. Итак, у вас есть 2 варианта:

  1. Освободите память самостоятельно, используя free().
  2. Оберните объект s в NSData, используя dataWithBytesNoCopy:length:, который получит права на выделенные данные и освободит его, когда объект NSData будет освобожден.

Вариант 2 будет выглядеть примерно так:

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

Затем, когда boxedS будет уничтожен, он также освободит s.

...