1

みなさん、ヒープ破損エラーが発生しています。わかりません。

char * c = (char *) malloc(1);
// main loop
_gcvt_s(c, 100, ball->get_X_Direction(), 10);
      if(pushFont(c, (SCREEN_WIDTH - 30), (SCREEN_HEIGHT - 40), message, screen,
font, textColor) == false)
      {
           //return 1; // error rendering text.
      }
// end main loop
free(c);

上記のコードは、_gcvt_s と pushFont() で c ポインターを使用する唯一の時間です。これは、char * を最初のパラメーターとして単純に受け入れ、テキストを画面に表示します。それ以外はcを使用しません。メイン ループの後で c を解放しようとすると (そうすべきだと思います)、Visual Studio がヒープでエラーを取得した (ヒープの破損) というエラーが表示されます。

pushFont への呼び出しをコメントアウトしても、まだエラーが発生します。

文字 (ヒープに割り当てた 1 バイト) を解放するとヒープが破損する理由を誰かに説明してもらえますか?

最後に、私のメイン ループは多くのことを行います。バディと私は WinSocket でピンポン ゲームを作成しています。本体の残りの部分はゲームのループです。投稿する必要があるとは思いませんでしたが、必要に応じてメインループ全体で投稿を更新しますが、malloc() と free() の理解が不十分だと思います。

皆さんありがとう、

4

4 に答える 4

11

_gcvt_s は、割り当てられたバッファーの最大サイズとして 2 番目のパラメーターを使用しませんか? 1 バイトを割り当てますが、_gcvt_s に 100 あることを伝えます。そのため、喜んで最大 100 バイトをバッファーに書き込み、ヒープを破壊します。その後、フリーがクラッシュします。100 バイトにアクセスする可能性がある場合は、100 バイトを割り当てます。

編集: C が文字列を格納および操作する方法を学ぶ必要があるようです。C は、文字列をメモリの連続したランに個々のバイトとして格納し、その後に文字列の終わりを示す余分な文字が続きます。この余分な文字の ASCII 値は 0 です (ASCII 48 である文字「0」ではありません)。したがって、"HELLO" のような文字列がある場合、格納するのに 6 バイト (5 文字とターミネータのそれぞれに 1 つずつ) が必要です。

_gcvt_s() が値をバッファーに返すためには、変換に十分なバイト数と追加の終了バイトを含める必要があります。_gcvt_s() の場合、10 文字の精度を求めています。ただし、潜在的な負の符号である小数点の余地も確保する必要があります。

この [ドキュメント]( http://msdn.microsoft.com/en-us/library/a2a85fh5(VS.80).aspx)によると、必要なバッファの最大サイズのヘッダーに #define があります。 _CVTBUFSIZE。そこにある例は、この問題に役立つはずです。

于 2009-05-25T07:42:50.550 に答える
4

_gcvt_s()ドキュメントによると、バッファとそのバッファの長さを最初の2つの引数として取ることがわかります。

errno_t _gcvt_s( 
   char *buffer,
   size_t sizeInBytes,
   double value,
   int digits 
);

edmalloc()バッファの長さは 1 バイトですが、長_gcvt_s()さは 100 バイトです。ここから探し始めます。

于 2009-05-25T07:47:39.980 に答える
3

なぜヒープを使用する必要があるのですか? 必要なのは 1 文字分のスペースだけの場合、ローカル変数を使用することはできません。

char c;
_gcvt_s(&c...

?

于 2009-05-25T07:44:02.263 に答える
2

float を格納するには、1 バイト以上が必要です。1 バイトよりも実用的な長さを割り当てます...

また、実際にはヒープは必要ありません。(少し大きすぎる) 16 バイトのバッファーを試して、_gcvt_s に正しいバッファー長を指定してください (魔法のような 100 ではなく)。あなたがそれにいる間、あなたの定数の魔法を解除してください。

const unsigned int cuFloatStringLength = 16;
const unsigned int cuFloatStringPrecision = 10;

char c[cuFloatStringLength];

_gcvt_s( c, cuFloatStringLength, ball->get_X_Direction(), cuFloatStringPrecision );

その後、問題はなくなるはずです。

于 2009-05-25T10:51:44.070 に答える