我可以重复使用zlib的z_stream进行多次操作吗?

时间:2016-09-15 14:31:53

标签: c++ c zlib

我目前正在玩zlib

通常的例子或多或少如下(C / C ++伪代码)

z_stream zs;
memset(&zs, 0, sizeof(zs));

if (deflateInit(&zs, Z_DEFAULT_COMPRESSION) != Z_OK)
    return false;

zs.next_in  = input_data;
zs.avail_in = input_size;

zs.next_out  = output_data;
zs.avail_out = output_size;

int result = deflate(&zs, Z_FINISH);

deflateEnd(&zs);

return result == Z_STREAM_END ? true : false;

使用valgrind我看到deflateInit和memset并不完全" free"操作,但需要相当长的时间。

我的问题是,我可以重复使用z_streamdeflateInit吗? 例如我可以通过更新缓冲区来不止一次放气吗?

2 个答案:

答案 0 :(得分:4)

是。您可以使用deflateReset()deflateEnd()后跟deflateInit()具有相同的效果,但完全避免代价高昂的去除和重新分配。

答案 1 :(得分:2)

查看the man

  

[...]我们要做的第一件事是使用deflateInit()初始化压缩的zlib状态。 必须在首次使用deflate()之前完成。 [..]

强调我的

关键词是第一次使用前的 。只要下次通货紧缩使用相同的配置,您就可以调用一次。

此外

  

[...]如果从输入文件读取时出错,则在返回错误之前调用deflateEnd()以释放分配的zlib状态,中止进程。我们不想要内存泄漏,现在我们呢?初始化状态后,可以随时调用 deflateEnd()。一旦完成,就必须调用deflateInit()(或deflateInit2())来启动新的压缩过程。 [...]

强调我的