1

モードで文字列のブロックを圧縮しようとしていpartial_flushます。さらに、処理する文字列が 1 つしかない場合が 1 つあります。

今、私は と を呼び出して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);
}

クラスはループごとに終了する必要があることを知っていますが、おそらくそうですが、報告deflateEndを続けているため、最終的に動的に割り当てられたデータはメモリに残ります:(inflateEndZ_DATA_ERROR

4

1 に答える 1

3

deflateEnd()返さZ_DATA_ERRORれたということは、その呼び出しの時点で、deflate 操作が何らかの中間状態 (つまり、完了していない状態) に残っていたことを意味します。を返しdeflate()たことはありませんでしたZ_STREAM_END

とにかく、deflate に割り当てられたメモリはすべて によって解放されdeflateEnd()ます。したがって、 を呼び出している場合deflateEnd()、zlib によって割り当てられたメモリのメモリ リークは発生しません。

deflate ストリームを適切に完了するにはdeflate()Z_FINISHflush パラメーターを指定してから、 を呼び出しdeflate()て、 が返されるまでその出力を消費する必要がありますZ_STREAM_END

于 2013-11-06T15:53:46.680 に答える