c++ - Zlib 用法 - deflateEnd() 错误

标签 c++ memory-leaks zlib memory-management

我正在尝试以 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);
}

我知道类应该在每次循环后结束,而且可能是这样,但是 deflateEndinflateEnd 一直报告 Z_DATA_ERROR,所以最后动态分配的数据保留在内存中:(

最佳答案

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

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

要正确完成deflate流,需要给deflate()Z_FINISHflush参数,然后调用deflate()来消耗它的输出,直到它返回 Z_STREAM_END

关于c++ - Zlib 用法 - deflateEnd() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19810999/

相关文章:

c++ - 在 C++/Qt 中作为 lambda 函数参数的槽

C:连接动态分配的字符串

c++ - 'zlib' 的 Uncompress() 返回 Z_DATA_ERROR

c++ - C代码和C++编译器

c++ - 如何在 Visual C++ 2010 Express 中链接 OpenGl?

.NET 资源泄漏陷阱

c++ - 在 Visual Studio 2012 中执行完 C++ 程序后,内存泄漏是否仍然存在?

linux - 在 Centos 上构建,安装 PerlIO::gzip 时出现 Zlib.h 错误

c# - .NET 中的 zlib 实现是否良好?

c++ - 重复调用函数时出现段错误