我有这个结构:
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 ./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)
答案 0 :(得分:2)
你可以:
void KillTypeMem(TypeMem *Mem){
free(Mem->Pags);
// Some stuff
}
但是你需要确保正确跟踪结构的生命周期,并且在释放之后永远不要使用某些东西。而且你还需要确保它在被分配或初始化为NULL
之后才被释放(我认为在free
上拨打NULL
是合法的,如果我',请更正我我错了。)
此外,如果您动态分配了TypeMem
,那么您在释放Mem->Pags
之前显然需要释放Mem
。
修改
问题不是来自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("Allocate\n");
Mem->Pags = (TypeCon*) malloc(memorySize);
}
void KillTypeMem(TypeMem *Mem){
printf("free\n");
free(Mem->Pags);
}
int main(){
TypeMem Memo;
StartsTypeMem(&Memo, 10*sizeof(TypeCon));
KillTypeMem(&Memo);
printf("done\n");
}
您需要隔离错误。没有代码,我们无法帮助您,但错误不是来自TypeMem.Pags
的分配或免费问题。
仔细阅读所有“有些东西”。
一个简单的想法:您在代码中的某个位置使用sizeof(TypeCon)
,对吧?您没有直接使用数组大小调用malloc
,例如Mem->Pags = (TypeCon*) malloc(10)
,因为如果您这样做,它肯定是您问题的根源。