我有这个结构:
typedef struct {
TypeCon *Pags;
// Some stuff
}TypeMem;
我有一个函数mallocs这个指针称为Pags .
void StartsTypeMem(TypeMem *Mem, int memorySize){
Mem->Pags = (TypeCon*) malloc(memorySize);
// Some stuff
}
然后我在我的代码中使用了这个TypeMem,但是当我完成时我就不能在Pags上使用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():无效的下一个大小(快):0x098db448 ** smv:malloc.c:2451:sYSMALLOc:断言`(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) - > size&0x1)&&((unsigned long)old_end&pagemask)== 0)'失败 . Abortado(imagemdonúcleogravada)
1 回答
您可以:
但是你需要确保正确跟踪结构的生命周期,并且在释放它之后永远不要使用它 . 而且你还需要确保它在被分配或被初始化为
NULL
之后才被释放(我认为在NULL
上调用free
是合法的,如果我错了就纠正我) .此外,如果您动态分配
TypeMem
,显然需要在释放Mem
之前释放Mem->Pags
.Edit
问题不是来自
StartsTypeMem
和KillTypeMem
函数,这些都绝对没问题 . 以下示例编译并运行,没有错误:您需要隔离错误 . 没有代码,我们无法帮助您,但错误不是来自
TypeMem.Pags
的分配或免费问题 .仔细看看所有的“有些东西” .
一个简单的想法:你在代码中的某个时刻使用了
sizeof(TypeCon)
,对吧?你不是直接用数组大小调用malloc
,比如Mem->Pags = (TypeCon*) malloc(10)
,因为如果你这样做,它肯定是你问题的根源 .