0

バッファをバイナリ ファイルに書き込んでいます。コードは次のとおりです。

FILE *outwav = fopen(outwav_path, "wb");
if(!outwav)
{
    fprintf(stderr, "Can't open file %s for writing.\n", outwav_path);
    exit(1);
}

[...]

//Create sample buffer
short *samples = malloc((loopcount*(blockamount-looppos)+looppos) << 5);
if(!samples)
{
    fprintf(stderr, "Error : Can't allocate memory.\n");
    exit(1);
}

[...]

fwrite(samples, 2, 16*k, outwav);   //write samplebuffer to file

fflush(outwav);
fclose(outwav);
free(samples);

最後の free() 呼び出しにより、ランダムなセグメンテーション違反が発生します。何度か頭を悩ませた後、おそらく fwrite 呼び出しが遅延後にのみ実行され、解放されたメモリが読み取られるためだと思いました。そのため、fflush 呼び出しを追加しましたが、まだ問題が発生します。

それを取り除く唯一の方法は、メモリを解放せず、OS に任せることです。ただし、これは悪い習慣であると思われるため、より良い解決策がないかどうかを尋ねたいと思います。

誰かが尋ねる前に、はい、ファイルが正しく開かれていることを確認します。はい、メモリが適切に割り当てられていることをテストします。いいえ、返されたポインターには一切触れません。

4

1 に答える 1

1

戻ってきたらfwrite、バッファでやりたいことを自由に行うことができます。通話を削除できfflushます。

freeプログラムのまったく無関係な部分のバッファ オーバーフロー エラーが、その作業を行うために必要な簿記情報を上書きしているように思えます。プログラムを次のようなツールで実行valgrindして、これが問題であるかどうかを調べ、プログラムの中でバッファ オーバーフローが発生している部分を見つけます。

于 2013-10-06T21:07:55.843 に答える