检查C中是否存在正确的内存释放

时间:2013-01-08 23:40:52

标签: c function memory malloc free

大家好!

我想在C中制作ascii俄罗斯方块。

但是我对指针还不是很有经验所以我想问你我是否做了这些函数,正确分配和释放内存(这意味着它们不会留下内存泄漏)。

这是我打电话来创建俄罗斯方块板的功能:

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 个答案:

答案 0 :(得分:2)

你最好的内存泄漏朋友是C编程的好指南。有很多可用的。 之后考虑一些工具,如valgrind或efence(linux),

http://valgrind.org/

efence附带了一些Linux发行版。

Windows也有用于堆分析的工具,例如在XP上:

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

答案 1 :(得分:0)

似乎没问题。最好在创建内存时检查malloc是否不返回NULL

答案 2 :(得分:0)

我觉得你没事。就像@Hassan Matar所说的那样,值得做。 但另一件事。我在这里学到了,在stackoverflow中,没有强制转换mallocs是一个更好的替代方法。

告诉编译器您(可能)知道您正在使用的数据类型可能会遇到的错误数量不值得冒险。

查看此question以获取更多详细信息。

答案 3 :(得分: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:

How detect malloc failure?