【发布时间】:2015-10-15 13:41:41
【问题描述】:
#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;
【问题讨论】:
-
这里没有什么可以释放的,除非
Cell被定义为指向结构的指针。如果Cell只是一个结构,那么您的Level结构会保存所有数据。你可能也没有malloc任何东西,是吗?你怎么知道“其他细胞被释放了”? -
我什至不明白你是如何观察到的/为什么你认为元素被释放了。
-
您必须提供更多上下文,因为没有人可以仅通过查看该函数来回答问题。
-
我认为这需要一堆额外的代码上下文才能解决。它部分取决于您的
cell结构是如何定义的。 -
在循环之前,我保存了所有单元格的地址。在第一次 free() 调用之后,我检查了所有这些地址的值,发现它们失去了价值。