私はデコードデータのために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()」関数で何が起こったのかわかりません。私のプログラムは適切に動作し、必要なデータを生成しますが、私はそれによって使用されるメモリを最適化したいと思います。何か助けてくれ説明してくれてありがとう!
"私はCでプログラムを作っています" - C++タグをスパムする理由は何ですか? – Olaf
'malloc'のキャストが悪いです - http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –
デバッガを使用してstream.outの値を取得します。 compress()の後の値を確認してください。関数内の値をチェックしてください。それらはすべて同一でなければなりません。 –