我目前正在玩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_stream
和deflateInit
吗?
例如我可以通过更新缓冲区来不止一次放气吗?
答案 0 :(得分:4)
是。您可以使用deflateReset()
与deflateEnd()
后跟deflateInit()
具有相同的效果,但完全避免代价高昂的去除和重新分配。
答案 1 :(得分:2)
查看the man
[...]我们要做的第一件事是使用deflateInit()初始化压缩的zlib状态。 必须在首次使用deflate()之前完成。 [..]
强调我的
关键词是第一次使用前的 。只要下次通货紧缩使用相同的配置,您就可以调用一次。
此外
[...]如果从输入文件读取时出错,则在返回错误之前调用deflateEnd()以释放分配的zlib状态,中止进程。我们不想要内存泄漏,现在我们呢?初始化状态后,可以随时调用 deflateEnd()。一旦完成,就必须调用deflateInit()(或deflateInit2())来启动新的压缩过程。 [...]
强调我的