为什么我不能释放结构中的数组?

时间:2013-04-21 17:47:02

标签: c

我有这个结构:

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)

1 个答案:

答案 0 :(得分:2)

你可以:

void KillTypeMem(TypeMem *Mem){
    free(Mem->Pags);
   // Some stuff
}

但是你需要确保正确跟踪结构的生命周期,并且在释放之后永远不要使用某些东西。而且你还需要确保它在被分配或初始化为NULL之后才被释放(我认为在free上拨打NULL是合法的,如果我',请更正我我错了。)

此外,如果您动态分配了TypeMem,那么您在释放Mem->Pags之前显然需要释放Mem

修改

问题不是来自StartsTypeMemKillTypeMem函数,这些都绝对没问题。以下示例编译并运行且没有错误:

#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),因为如果您这样做,它肯定是您问题的根源。