C - 释放包含2d数组的结构

时间:2015-10-15 13:41:42

标签: c struct free

#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;

2 个答案:

答案 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动态分配内存,那么只释放返回的指针也会释放数组。