0

どうやら SDL_Mixer のこの関数は死に続けているようですが、その理由はわかりません。誰にもアイデアはありますか?Visual Studio によると、このクラッシュは、Windows が realloc() 行のどこかでブレークポイントをトリガーすることによって発生します。

問題のコードは、特に SD​​L_Mixer の SVN バージョンからのものです。違いがある場合。

static void add_music_decoder(const char *decoder) 
{ 
  void *ptr = realloc(music_decoders, num_decoders * sizeof (const char **)); 
  if (ptr == NULL) { 
    return; /* oh well, go on without it. */ 
  } 
  music_decoders = (const char **) ptr; 
  music_decoders[num_decoders++] = decoder; 
} 

私は Visual Studio 2008 を使用しており、music_decoders と num_decoders はどちらも正しいです (music_decoders には文字列 "WAVE" へのポインターが 1 つ含まれており、music_decoders.ptr は 0x00000000 であり、私が知る限り、クラッシュは realloc にあるようです() 関数. このクラッシュの問題を処理する方法を知っている人はいますか? この問題を解決するために、多少のリファクタリングを行う必要はありません。

4

5 に答える 5

5

一つには、num_decodersポインタの配列を割り当ててからnum_decoders、その配列のインデックスに書き込むことは無効です。おそらく、この関数が初めて呼び出されたときに、0バイトが割り当てられ、結果へのポインターが書き込まれました。これにより、メモリアロケータの構造が破損し、reallocが呼び出されたときにクラッシュ/ブレークポイントが発生する可能性があります。

ところで、バグを報告する場合は、add_chunk_decoder(mixer.cで)同じように壊れていることに注意してください。

交換します

void *ptr = realloc(music_decoders, num_decoders * sizeof (const char **));

void *ptr = realloc(music_decoders, (num_decoders + 1) * sizeof(*music_decoders)); 
于 2009-06-06T22:30:51.317 に答える
2

SDL_Mixer.DLL ファイルとプログラム ビルドが同じ C ランタイム設定を使用していることを確認してください。メモリが 1 つの CRT を使用して割り当てられ、別の CRT を使用して再割り当てされる可能性があります。

プロジェクト設定で、C/C++ -> コード生成を探します。そこにあるランタイム ライブラリの設定は、両方で同じである必要があります。

于 2009-06-06T21:23:19.377 に答える
1

music_decoders[num_decoders++] = デコーダー;

あなたはここで一人です。num_decoders が配列のサイズである場合、最後のインデックスは num_decoders - 1 です。したがって、行を次のように置き換える必要があります。

music_decoders[num_decoders-1] = デコーダー;

また、古いサイズではなく新しいサイズに再割り当てする必要があるため、関数の最後ではなく最初に num_decoders をインクリメントすることをお勧めします。

もう 1 つ: ダブル スターではなく、sizeof (const char *) でサイズを乗算します。

于 2009-06-06T22:46:48.973 に答える
0

クラッシュは通常、ブレークポイントによってトリガーされません。クラッシュしているのですか、ブレークポイントが原因で壊れているのですか、それともブレークポイントの処理中にクラッシュしているのですか?

デバッグ出力ウィンドウには、CRTブレークポイントがヒットしている理由に関する情報が含まれている必要があります。たとえば、メモリ操作中に、元のブロックの周囲のガードバイトが変更されていることに気付く場合があります(add_music_decoderが呼び出される前に発生したバッファオーバーランが原因)。CRTは、メモリが解放されたとき、および場合によっては再割り当てされたときに、これらのガードページをチェックします。

于 2009-06-06T22:22:55.480 に答える
0

ああ、C プログラミングの楽しさ。realloc (または malloc または free) でのクラッシュは、メモリ ブロックの境界を超えて書き込むことによってトリガーされる可能性があります。これは、プログラムの他の場所でも発生する可能性があります。私が過去に使用したアプローチは、mallocパッケージのデバッグのフレーバーです。サードパーティのソリューションに飛び込む前に、ドキュメントをチェックして、Visual Studio がこれらの線に沿って何かを提供しているかどうかを確認してください。

于 2009-06-06T20:39:38.590 に答える