#define LEVEL_MAX_WIDTH 25
#define LEVEL_MAX_HEIGHT 12
typedef struct Level
{
Cell cells[LEVEL_MAX_HEIGHT][LEVEL_MAX_WIDTH]; /* Cell is also a struct */
int width;
int height;
} Level;
void level_free(Level* level)
{
/* Free cells*/
for (int i = 0; i < level->height; i++) {
for (int j = 0; j < level->width; j++) {
free(level->cells[i][j]);
}
}
free(level);
}
当我调试level_Free(Level*)
方法时,我注意到了一些奇怪的东西。
在第一次迭代(i=0 and j=0)
期间,在调用方法free(level->cells[i][j]
之后:level->[i]
中的所有其他单元格都被取消分配。
释放一个Cell元素导致释放整个数组,其中该元素是其中的一部分。
任何人都可以解释为什么会这样吗?
编辑: 这就是我“创造”我的细胞的方式:
Cell* cell = malloc(sizeof(Cell));
cell->row = r;
cell->col = c;
cell->type=level_symbol_to_cell_type(symbol);
cell->owner=level_symbol_to_owner(symbol);
/* place cell */
level->cells[r][c] = *cell;
typedef struct Cell
{
int row;
int col;
CellType type; /* enum */
Owner owner; /* enum also */
} Cell;
答案 0 :(得分:1)
如果每个Cell都是结构而不是指向动态分配内存的指针,则不应单独释放数组成员。
您需要动态释放已动态分配的内存。如果你有malloc
'等级,则需要free
它。
但是数组及其成员的内存位于为Level分配的内存块中。您在评论中注意到Cell是一个结构。因此,每个Cell的内存包含在为Level分配的内存块中,并通过释放Level来处理。
void level_free(Level* level)
{
free(level);
}
您的编辑显示Cell本身指向没有动态分配的内存。 如果相反,你也必须释放它。
void level_free(Level* level)
{
/* Free cells*/
for (int i = 0; i < level->height; i++) {
for (int j = 0; j < level->width; j++) {
cell_free( & level->cells[i][j]);
}
}
free(level);
}
void cell_free( Cell * level) {
...
}
答案 1 :(得分:0)
你应该MIN([Date Time])
只指向动态分配的内存,否则行为是未定义的。
如果为free
动态分配内存,那么只释放返回的指针也会释放数组。