gpt4 book ai didi

C- 可能的内存泄漏?

转载 作者:行者123 更新时间:2023-12-01 11:55:27 25 4
gpt4 key购买 nike

我觉得我有一段代码会导致内存泄漏。我有一个包含两个二维数组的数据结构,一个包含整数,一个包含指向动态分配对象( Sprite )的指针。数据结构是一个 tilemap,int 是每个位置的数字索引,从文件中读取。我称该索引为“瓷砖”。出于行为目的,这说明它是哪种瓷砖(即玩家对水的 react 与对泥土或冰的 react 不同)。这些对象是在各自位置绘制的 Sprite 。该索引称为“图像”。该索引告诉 tilemap 在该位置绘制什么 Sprite 。

typedef struct
{
int** tiles;
sprite*** images;
int w, h;
} tilemap;

我有一个函数可以创建一个新的 tilemap,对其进行初始化并返回它。

tilemap* new_tilemap(int w, int h, const char* filename)
{
tilemap* tm = malloc(sizeof(tilemap));
tm->w = w;
tm->h = h;

/*allocate memory space for the tiles index*/
tm->tiles = malloc(sizeof(int) * h);
int i, j;
for (i = 0; i < h; ++i)
{
tm->tiles[i] = malloc(sizeof(int) * w);
}

/*fill the index with the appropriate data from a file*/
FILE* file = fopen (filename, "rb");
if (file == NULL)
{
printf("Failed to open map %s\n", filename);
}

for (j = 0; j < h; ++j)
{
for (i = 0; i < w; ++i)
{
fscanf(file, "%d", &(tm->tiles[j][i]));
}
}
fclose(file);

/*allocate space for the images*/
tm->images = malloc(sizeof(sprite*) * h);
for (i = 0; i < h; ++i)
{
tm->images[i] = malloc(sizeof(sprite*) * w);
}

/*load images based on what type of tile is at that position*/
for (j = 0; j < h; ++j)
{
for (i = 0; i < w; ++i)
{
switch (tm->tiles[j][i])
{
case 0:
tm->images[j][i] = new_sprite_file("dat/tiles/0.bmp", 1);
break;
case 1:
tm->images[j][i] = new_sprite_file("dat/tiles/1.bmp", 2);
break;
}
tm->images[j][i]->x = i*tm->images[j][i]->w;
tm->images[j][i]->y = j*tm->images[j][i]->h;
}
}
return tm;
}

然后,为了释放 tilemap 和它的所有结构,我有这个函数:

void free_tilemap(tilemap* tm)
{
/*loop through and free each of the images in the array*/
int i, j;
for (j = 0; j < tm->h; ++j)
{
for (i = 0; i < tm->w; ++i)
{
free(tm->images[j][i]);
}
}
/*free the actual array*/
free(tm->images);
/*free the tile array?*/
free(tm->tiles);
/*free the entire tilemap structure*/
free(tm);
}

但是,我觉得它并没有释放我分配的所有内存,因为我在磁贴上使用了两次 malloc,但只释放了一次。我不知道这是否是一个问题,因为它们是整数,但我认为我可能必须遍历 tiles 数组,释放每一行,然后遍历并释放每一列(包含行),在与分配的方式相同。这是需要做的事情还是我只是无知和/或偏执狂?与图像数组相同。另外,请随意指出我的代码中的其他缺陷,因为我知道我不是最好的程序员。

最佳答案

当然,您应该在空闲时镜像 malloc

for (i = 0; i < h; ++i)
{
tm->tiles[i] = malloc(sizeof(int) * w);
}

/* Inside free_tilemap. */
for (i = 0; i < h; ++i)
{
free(tm->tiles[i]);
}
free(tm->tiles);

与此非常相似的其他 for 也是如此。仅释放 tiles 不会自动释放级联中的 tiles[0..h]

关于C- 可能的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7716514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com