我正在尝试以 partial_flush
模式压缩字符串 block ,此外还有一种情况是只有一个字符串需要处理。
现在我正在调用 deflateInit2(params...)
、deflate()
和 deflateEnd()
。我在输出中得到了一些正确的输出,witch 是 uncompressable(tried)
,但是在尝试使用 deflateEnd(&strm);
或 释放所有内存时出现错误inflateEnd(&strm);
目前,我认为这里不可能在应用程序运行时创建这种情况,但我需要查明并消除内存泄漏错误。
整个示意图是这样的:
class Czlib{
compress( std::string );
decompress( std::string );
Czlib() // allocate inflate and deflate state here
~Czlib()// deallocate both here
}
int main(){
for (char c=0x00 ; ; c++){
std::string str(255, c);
Czlib zlib;
zlib.compress(str);
}
我知道类应该在每次循环后结束,而且可能是这样,但是 deflateEnd
和 inflateEnd
一直报告 Z_DATA_ERROR
,所以最后动态分配的数据保留在内存中:(
最佳答案
deflateEnd()
返回 Z_DATA_ERROR
意味着 deflate 操作在调用时处于某个中间状态,即未完成。所以 deflate()
从未返回过 Z_STREAM_END
。
无论如何,所有为 deflate 分配的内存都由 deflateEnd()
释放。因此,如果您调用 deflateEnd()
,zlib 分配的内存将不会发生内存泄漏。
要正确完成deflate流,需要给deflate()
Z_FINISH
flush参数,然后调用deflate()
来消耗它的输出,直到它返回 Z_STREAM_END
。
关于c++ - Zlib 用法 - deflateEnd() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19810999/