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

我知道该类应该在每个循环之后死掉,但是它应该会死掉,但是deflateEndinflateEnd会不断报告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/

10-11 23:14