尝试释放数组时发生访问冲突错误

时间:2019-04-12 22:06:13

标签: c windows

我目前正在为个人项目设计结构。我正在尝试使用动态分配的双向数组,然后释放它们占用的空间。当我尝试释放分配的空间时发生错误。

我能够将问题的来源缩小到我设置的销毁我的结构的功能,但无法指出其中的错误原因。更令人担忧的是,错误(访问冲突)仅触发一半的时间。 我在下面包括了一些功能,并附有一些评论。很抱歉,如果我在此处包含太多代码,但是我很迷失在单词上,确实感觉到初始化结构的方式可能会影响我是否正确销毁它们。

#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错误。但是再次,只是偶尔。

0 个答案:

没有答案