我目前正在为个人项目设计结构。我正在尝试使用动态分配的双向数组,然后释放它们占用的空间。当我尝试释放分配的空间时发生错误。
我能够将问题的来源缩小到我设置的销毁我的结构的功能,但无法指出其中的错误原因。更令人担忧的是,错误(访问冲突)仅触发一半的时间。 我在下面包括了一些功能,并附有一些评论。很抱歉,如果我在此处包含太多代码,但是我很迷失在单词上,确实感觉到初始化结构的方式可能会影响我是否正确销毁它们。
#include <stdio.h>
#include <stdlib.h>
typedef struct f_part f_part;
typedef struct field field;
//these are the structures I used:
//part of a field: includes a character and a color
struct f_part
{
char caractere;
short int color;
};
//field: points to a bidimensionnal array of f_part, and remember its size
struct field
{
int fsize_x;
int fsize_y;
f_part **fbody;
};
field* fieldInitialize(const int size_x, const int size_y) //this function seems to work correctly, I've mostly added it as an indicator
{
field* terrain = malloc(sizeof(*terrain));
if (terrain == NULL)
printf("fail1");
terrain->fsize_x = size_x;
terrain->fsize_y = size_y;
f_part* ptrToFPart = NULL;
terrain->fbody = malloc(sizeof(ptrToFPart) * size_x); //this is where I allocate the space for an array of pointers
if (terrain->fbody == NULL)
printf("fail2");
int i,j;
for (i = 0 ; i < size_x ; i++)
{
terrain->fbody[i] = malloc(sizeof(f_part) * size_y);
for (j = 0 ; j < size_y ; j++)
{
terrain->fbody[i][j].caractere = 'a';
terrain->fbody[i][j].color = 0;
}
}
terrain->fsize_x = size_x;
terrain->fsize_y = size_y;
return terrain;
}
void fieldDestroy(field* terrain) //this is the function that is supposed to destroy the object and free the memory, and fails
{
int i;
for (i = 0 ; i < terrain->fsize_x ; i++)
{
free(terrain->fbody[i]); //this part always goes well
}
printf("flag 1\n");
free(terrain->fbody); //this is where the access violation happens, when it does
printf("flag 2\n");
free(terrain); //this part goes well too
printf("flag 3\n");
}
int main()
{
field* testField = fieldInitialize(5, 5);
fieldDestroy(testField); //This is the function that fails. Sometimes.
return 0;
}
当我尝试释放为指针数组分配的空间时,错误发生在倒数第二行。除了并非总是如此!有时,我可以释放terrain-> fbody,但一切进展顺利,但有时却无法释放空间。 我得到的错误是0xC0000005,这显然转化为“访问冲突”。我了解在处理动态内存分配时很常见,但是那为什么我似乎只有一半时间会收到错误?
编辑:好的,所以我已经编辑了一些代码。有趣的是,虽然我的Windows 10在标志1和2之间失败,但我的Windows 7在标志2和3之间失败,并且返回了0xC0000005错误。但是再次,只是偶尔。