大家好!
我想在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 ......你能检查一下我的方法吗?
答案 0 :(得分:2)
你最好的内存泄漏朋友是C编程的好指南。有很多可用的。 之后考虑一些工具,如valgrind或efence(linux),
efence附带了一些Linux发行版。
Windows也有用于堆分析的工具,例如在XP上:
答案 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: