1

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

现在我打电话deflateInit2(params...)deflate()deflateEnd()。我在输出中得到了一些正确的输出,witch is 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,所以最终动态分配的数据会留在内存中:(

4

1 回答 1

3

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

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

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

于 2013-11-06T15:53:46.680 回答