我正在尝试以partial_flush
模式压缩字符串块,而且有一种情况是只有一个字符串要处理。
现在我正在调用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/