无法释放结构的数据

时间:2019-12-29 14:48:34

标签: c memory malloc free

我将此struct作为程序的一部分以及它的创建和销毁功能。但是,当我尝试释放struct实例时,程序由于与free相关的错误而崩溃,例如,main函数会因munmap_chunk(): invalid pointer

而崩溃。

我不明白为什么指针无效。

p.s .:在new中初始化euCreate()的最佳方法是什么?我尝试的所有操作都会导致内存泄漏或无法正常工作。

Eu euCreate()
{
    Eu new = malloc(sizeof(new));
    (*new).Judges = malloc(sizeof(Judge) * 2);
    (*new).Jlen = 2;
    (*new).Jidx = 0;
    (*new).States = malloc(sizeof(State) * 2);
    (*new).Slen = 2;
    (*new).Sidx = 0;
    return new;
}

void euDestroy(Eu eu)
{
    free(eu->Judges);
    free(eu->States);
}

int main()
{
    Eu eu = euCreate();
    euDestroy(eu);
}

typedef struct eu{
    struct judge* Judges;
    int Jlen;
    int Jidx;
    struct state* States;
    int Slen;
    int Sidx;
}* Eu;

1 个答案:

答案 0 :(得分:1)

您没有为结构分配足够的空间:

Eu new = malloc(sizeof(new));

sizeof(new)为您提供了指针的大小,而不是指针所指向的大小。因此,当您随后将值分配给该结构的成员时,您将写出已分配内存的边界。这会调用undefined behavior,在这种情况下,这会导致您的代码崩溃。

为指针指向所指向的空间分配空间。

Eu new = malloc(sizeof(*new));

此外,键入def指针也是一种不好的做法,因为它掩盖了您正在使用指针的事实。最好只对结构进行typedef定义,并在需要时在每个声明中显式使用指针。