Zlib usage - deflateEnd() error

Zlib usage - deflateEnd() error

本文关键字:error deflateEnd usage Zlib      更新时间:2023-10-16

>我正在尝试以partial_flush模式压缩字符串块,此外,有一种情况只有一根字符串要处理。

现在我打电话给deflateInit2(params...)deflate()deflateEnd()。我在输出中得到了一些正确的输出,女巫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);
}

我知道类应该在每次循环后死亡,可能确实如此,但是deflateEndinflateEnd不断报告Z_DATA_ERROR,因此最终动态分配的数据保留在内存中:(

deflateEnd()返回Z_DATA_ERROR意味着在该调用时,放气操作处于某种中间状态,即未完成。 所以deflate()从未返回过Z_STREAM_END.

无论如何,所有为放气分配的内存都由 deflateEnd() 释放。 因此,如果您调用 deflateEnd() ,则 zlib 分配的内存不会发生内存泄漏。

要正确完成 Deflate 流,您需要为 deflate() 提供 Z_FINISH flush 参数,然后调用 deflate() 来消耗其输出,直到它返回 Z_STREAM_END

相关文章: