我有这样一个结构体:
typedef struct {
TypeCon *Pags;
// Some stuff
}TypeMem;
我有一个函数malloc这个指针叫做Pags
void StartsTypeMem(TypeMem *Mem, int memorySize){
Mem->Pags = (TypeCon*) malloc(memorySize);
// Some stuff
}
然后我在我的代码中使用这个TypeMem,但是当我完成后,我不能在pages上使用free()。据我所知,你不能在另一个函数中释放malloc的数组…但是我不知道……我做错了什么?
在main ():
TypeMem Memo;
StartsTypeMem(&Memo, size);
// Some stuff using the TypeMem
KillTypeMen(&Memo);
KillTypeMen可以是:
void KillTypeMem(TypeMem *Mem){
free(Mem->Pags);
// Some stuff
}
错误信息(从注释到一个答案):
* glibc detected ./smv: free(): invalid next size (fast): 0x098db448 ** smv: mallocc .c:2451: sYSMALLOc: Assertion ' (old_top == ((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) &&;Old_size == 0) || ((unsigned long)(Old_size)>= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) &~((2 * (sizeof(size_t))) - 1)) &&((old_top) ->大小,0 x1),,((unsigned long)old_end &Pagemask) == 0)'失败。Abortado (imagem do núcleo gravada)
您可以:
void KillTypeMem(TypeMem *Mem){
free(Mem->Pags);
// Some stuff
}
但是您需要确保正确地跟踪了结构体的生命周期,并且永远不要在释放它之后使用它。并且您还需要确保只有在它被分配或初始化为NULL
后才释放它(我认为在NULL
上调用free
是合法的,如果我错了请纠正我)。
同样,如果动态分配TypeMem
,显然需要在释放Mem
之前释放Mem->Pags
。
编辑
问题不是来自StartsTypeMem
和KillTypeMem
函数,这些是绝对好的。以下示例编译并运行时不会出现错误:
#include <stdlib.h>
#include <stdio.h>
typedef struct { int i; } TypeCon;
typedef struct {
TypeCon *Pags;
}TypeMem;
void StartsTypeMem(TypeMem *Mem, int memorySize){
printf("Allocaten");
Mem->Pags = (TypeCon*) malloc(memorySize);
}
void KillTypeMem(TypeMem *Mem){
printf("freen");
free(Mem->Pags);
}
int main(){
TypeMem Memo;
StartsTypeMem(&Memo, 10*sizeof(TypeCon));
KillTypeMem(&Memo);
printf("donen");
}
您需要隔离错误。如果没有代码,我们无法帮助您,但错误不是来自TypeMem.Pags
的分配或自由问题。
把所有的"一些东西"仔细看一遍。
一个快速的想法:您确实在代码中的某些地方使用了sizeof(TypeCon)
,对吗?您没有直接调用malloc
与数组大小,如Mem->Pags = (TypeCon*) malloc(10)
,因为如果你这样做,它肯定是你的问题的根源。