2017-04-16 1 views
-1

私はデコードデータのためにC言語でプログラムを作っています。データが圧縮されているので、正しい結果を圧縮解除してデータと成功を解凍しようとしました。次に、この解凍されたデータを他のプロセスに渡します。このプロセスは、新しいデータを割り当て、渡されたデータから読み込み、新しいデータに書き込んだり、古いデータを解放したりします(これはもはや使用されないためです)。しかし、実行すると、 "free()"行に "decode.exeがブレークポイントをトリガしました"というエラーが生成されます。 私のコードは次のとおりです。無料のデータが存在するとメモリリークが発生しますか?

int decode (uint8_t* data, uint32_t size) { 
    compressed_stream stream; 
    stream.data = data; 
    stream.data_size = size; 

    uint32_t outsize; 
    //Compute output size and assign to outsize 
    //... 
    stream.out = (uint8_t*)malloc(outsize); 
    stream.size = outsize; 

    stream.inpos = stream.outpos = 0; 
    decompress(&stream); 
    //Not free stream.data yet 
    process(stream.out); 
    return 0; //Handling error later 
} 

「解凍()」関数がテストされ、それが割り当てられた出力データへのポインタを変更しようとしません。同様に、

int process(uint8_t* data) 
{ 
    //Process data here, assign it to global scope pointers for easy handling 
    //... 
    free(data); 
    return 0; 
} 

:計算された私のデータとエラーなし、および「特大」を出力するために必要な大きさに等しくない「のmalloc()」プロセスは以下の通りである、null以外のデータ

を返し、処理されたデータはテストされ、エラーは発生しません。しかし、私はライン "フリー(データ)"に達するとクラッシュします。

"process()" funcを使用せずに、 "decompress()"の後にstream.outに関連付けられたデータを解放しようとしました。しかし、それはまだ起こった。 しかし、私は "無料(データ);を変更しようとしました。 〜:

realloc(data, 1); 
free(data); 

エラーは発生しません。または、私は、 "outsize"の値を、reallocデータなしでも圧縮解除されたデータの出力に必要な値よりもずっと大きくしました。エラーもありません。

「malloc()」と「free()」関数で何が起こったのかわかりません。私のプログラムは適切に動作し、必要なデータを生成しますが、私はそれによって使用されるメモリを最適化したいと思います。何か助けてくれ説明してくれてありがとう!

+1

"私はCでプログラムを作っています" - C++タグをスパムする理由は何ですか? – Olaf

+0

'malloc'のキャストが悪いです - http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –

+0

デバッガを使用してstream.outの値を取得します。 compress()の後の値を確認してください。関数内の値をチェックしてください。それらはすべて同一でなければなりません。 –

答えて

0

私は問題を発見しました。私の "decompress()"関数は出力のために "malloc()"によって割り当てられたメモリのサイズよりもいくつかのバイトを書きます。私が期待しているように、エラーは発生しません。あなたのコメントにとても感謝しています。私はプロセスの前にメモリの位置を格納しようとしたときに、解凍時に位置を変更し、減算を行いました。その後、私は以前に割り当てたメモリのサイズよりも大きいことがわかりました。

関連する問題