我将此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;
答案 0 :(得分:1)
您没有为结构分配足够的空间:
Eu new = malloc(sizeof(new));
sizeof(new)
为您提供了指针的大小,而不是指针所指向的大小。因此,当您随后将值分配给该结构的成员时,您将写出已分配内存的边界。这会调用undefined behavior,在这种情况下,这会导致您的代码崩溃。
为指针指向所指向的空间分配空间。
Eu new = malloc(sizeof(*new));
此外,键入def指针也是一种不好的做法,因为它掩盖了您正在使用指针的事实。最好只对结构进行typedef定义,并在需要时在每个声明中显式使用指针。