2016-07-26 2 views
0

Я играю с zlib и после прочтения zlib_how У меня все еще есть пара вопросов. Как я понимаю, необходимо вызывать deflateInit перед вызовом любого deflate(), который в порядке, но что происходит, когда у меня есть намерение повторно использовать один и тот же поток более одного раза?Правильная настройка и использование zlib

Должен ли я звонить deflateEnd каждый раз, когда заканчиваю компрессию, а затем повторно инициализирую каждый раз, когда вызывается компрессия с дополнительным вызовом на deflateInit? Что такое динамические распределения внутренних буферов?

Я вижу, что init и end malloc/free много, может ли он быть сконфигурирован таким образом, что внутренние буферы будут повторно использоваться между вызовами?

+0

Продвижение без объяснения причин? Очень полезно ... – kreuzerkrieg

ответ

3

Вы должны использовать deflateReset() вместо deflateEnd() следуют deflateInit() для того, чтобы избежать ненужных free() «s и malloc()» s.

Вы также должны прочитать документацию в zlib.h, где вы бы это обнаружили.

+0

Спасибо, Марк! Действительно ли deflateReset() полезен для вызова в случае Z_STREAM_ERROR после вызова deflate()? вместо deflateEnd? и что делать, если deflateReset() возвращает Z_STREAM_ERROR? Вызов deflateEnd(), за которым следует deflateInit()? – kreuzerkrieg

+1

Если вы получаете 'Z_STREAM_ERROR', то это состояние либо не было инициализировано, ни закончилось, ни повреждено. Для любого из них вы не должны называть 'deflateEnd()' или 'deflateReset()', так как состояние больше недействительно. (Хотя они также могут заметить это и возвращать 'Z_STREAM_ERROR'.) Если вы правильно используете zlib, то есть инициализируете, перезагружаете и заканчиваете в правильном порядке, и вы никогда не произвольно не записываете состояние, то вы никогда не получите 'Z_STREAM_ERROR'. –

+0

Это очень важное замечание. Еще раз спасибо! – kreuzerkrieg

Смежные вопросы