0

こんにちは、みんな!

Cでアスキーテトリスを作ろうとしています。

ただし、ポインターについてはまだあまり経験がないので、これらの関数を作成、割り当て、メモリを正しく解放したかどうか (メモリ リークを残さないことを意味します) をお尋ねしたいと思います。

これは、テトリス ボードを作成するために呼び出す関数です。

char** InitTetris( int size_x , int size_y )
{
   /* 
      InitTetris allocates memory for the tetris array.
      This function should be called only once at the beginning of the game.
   */  

   //Variables
   int i;
   char** tetris = NULL;

   //Allocate memory
   tetris = ( char** ) malloc ( size_x * sizeof ( char* ) );

   for ( i = 0 ; i < size_x ; i++ )
   {
      tetris[i] = ( char* ) malloc ( size_y * sizeof ( char ) );
   }

   return tetris;

}//End of InitTetris

そして、これはメモリを解放する関数です:

void ExitTetris ( char** tetris , int size_y )
{
   /*
      This function is called once at the end of the game to
      free the memory allocated for the tetris array.
   */

   //Variables
   int i;

   //Free memory
   for ( i = 0 ; i < size_y ; i++ )
   {
      free( tetris[i] );
   }

   free( tetris );

 }//End of ExitTetris    

別の関数から処理されるすべて

void NewGame()
{
   //Variables

   char** tetris;          /* Array that contains the game board       */
   int size_x , size_y;    /* Size of tetris array                     */

   //Initialize tetris array
   tetris = InitTetris( size_x , size_y );

   //Do stuff.....

   //Free tetris array
   ExitTetris( tetris , size_y );

}//End of NewGame

プログラムはすべて正常に動作します。人々の RAM を散らかさないようにしたいだけです。方法を確認していただけますか?

4

4 に答える 4

2

メモリ リークの親友は、C プログラミングの優れたガイドです。利用可能なものがたくさんあります。その後、valgrind や efence (linux) などのツールを検討します。

http://valgrind.org/

efence は、いくつかの Linux ディストリビューションに付属しています。

Windows には、XP などのヒープ分析用のツールもあります。

http://support.microsoft.com/kb/268343

于 2013-01-08T23:50:28.260 に答える
0

大丈夫そうです。NULLメモリの作成中にmalloc が戻らないかどうかを確認することをお勧めします。

于 2013-01-08T23:44:33.080 に答える
0

割り当てられなかったメモリがあるかどうかを確認します。メモリが割り当てられていない場合、割り当て解除によってクラッシュが発生する可能性があるためです。

//In InitTetris:
tetris = ( char** ) malloc ( size_x * sizeof ( char* ) );

//if tetris == NULL, then exit from the function with a failure code
//and don't continue the rest of the program.
//

malloc が失敗する可能性について詳しくは、次の URL を参照してください。

mallocの失敗をどのように検出しますか?

于 2013-01-09T00:04:49.160 に答える
0

大丈夫だと思います。@Hassan Matarが言ったことは、やる価値があります。ただし、もう1つ。ここで、stackoverflow で学びました。malloc をキャストしない方が、キャストするよりも優れた方法です。

作業しているデータ型を(おそらく)知っていることをコンパイラに伝えるために発生する可能性のあるエラーの数は、リスクに見合う価値がありません。

詳細については、この質問を確認してください。

于 2013-01-08T23:59:33.030 に答える