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

  • 本文关键字:结构 数组 释放 不能
  • 更新时间 :
  • 英文 :


我有这样一个结构体:

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

编辑

问题不是来自StartsTypeMemKillTypeMem函数,这些是绝对好的。以下示例编译并运行时不会出现错误:

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

最新更新