Утечка в MiniZip - PullRequest
       1

Утечка в MiniZip

1 голос
/ 02 декабря 2010

Я использую MiniZip для распаковки файла в проекте iPhone. Все работает нормально, но я обнаружил утечку инструментов в коде MiniZip в этой строке:

unzip.c линия 493

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

Я понимаю, что переменная, выделенная с помощью ALLOC, возвращается и не освобождается. В target-C я бы просто сделал авто-релиз, но как мне добиться этого в обычном C?

Спасибо, Винсент.

Ответы [ 4 ]

2 голосов
/ 02 декабря 2010

Вызывающий этот метод отвечает за s и должен free(), когда он больше не требуется, чтобы избежать утечки памяти.Это соглашение на языке C.

Вы должны будете связать стороннюю библиотеку GC, возможно, что-то вроде GC Ханса Бома для C / C ++ .Тем не менее, я предлагаю просто освободить память, когда это уместно по вашему усмотрению.Таким образом вы столкнетесь с меньшими трудностями.

1 голос
/ 21 декабря 2010

unzOpen () предназначен для выделения и возврата дескриптора вызывающей стороне. После того, как вы получите этот дескриптор, вы можете работать с этим zip-архивом (то есть искать файл, надувать файлы из архива, ...). После того, как все операции завершены, вы должны явно закрыть zip-архив, вызвав unzClose (s), который отменяет выделение s для вас.

Вот пример для извлечения конкретного файла из архива:

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 для получения дополнительной информации.

1 голос
/ 02 декабря 2010
free(s);

(заполнитель до 15 символов)

0 голосов
/ 02 декабря 2010

В какой бы функции она ни находилась, проблема не в этой функции.Он должен возвращать выделенный объект, а не бесполезно выделять и освобождать перед возвратом.Проблема в том, что вы используете библиотеку.Вы никогда не вызываете функцию, чтобы освободить указатель, полученный при вызове этой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...