Проблема с утечкой памяти iPhone в ZipArchive lib

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

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


person Kzrbill    schedule 08.09.2010    source источник


Ответы (2)


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

person Bad Boy    schedule 15.07.2011

Нет, вы не можете автоматически выпускать его. Автоматическое освобождение доступно только для объектов 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.

person Dave DeLong    schedule 08.09.2010
comment
Спасибо, хотя он все еще протекает, несмотря на попытку исправить. ALLOCated продукт unzOpen2 присваивается непосредственно переменной экземпляра члена частного класса, например, в классе использования: _unzFile = unzOpen((const char*)[zipFile UTF8String]); Итак, в методе Dealloc класса я освобождаю его следующим образом: if (_unzFile != NULL){ free(_unzFile); } Я не хотел идти по пути включения объекта C в объект NSData*, так как есть много ссылок на переменную экземпляра _unzFile: я бы еще больше запутался в этом слиянии языков! - person Kzrbill; 13.09.2010