-4

我有这个结构:

typedef struct {
    TypeCon *Pags;
    // Some stuff
}TypeMem;

我有一个函数可以分配这个指针,称为 Pags。

void StartsTypeMem(TypeMem *Mem, int memorySize){
    Mem->Pags = (TypeCon*) malloc(memorySize);
   // Some stuff
}

然后我在我的代码中使用这个 TypeMem,但是当我完成后我不能在 Pags 上使用 free() 。据我了解,您不能在另一个函数中释放 malloc 的数组...但我不知道...我做错了什么?

在主():

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(): invalid next size (fast): 0x098db448 * * smv: malloc.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)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' 失败。Abortado (imagem do núcleo gravada)

4

1 回答 1

2

你可以:

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

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

此外,如果您TypeMem是动态分配的,那么您显然需要在 freeMem->Pags之前 free Mem

编辑

问题不在于StartsTypeMemandKillTypeMem函数,它们绝对没问题。以下示例编译并运行没有错误:

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

于 2013-04-21T17:48:34.487 回答