首页 文章

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

提问于
浏览
-4

我有这个结构:

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 回答

  • 2

    您可以:

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

    但是你需要确保正确跟踪结构的生命周期,并且在释放它之后永远不要使用它 . 而且你还需要确保它在被分配或被初始化为 NULL 之后才被释放(我认为在 NULL 上调用 free 是合法的,如果我错了就纠正我) .

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

    Edit

    问题不是来自 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) ,因为如果你这样做,它肯定是你问题的根源 .

相关问题