Free()函数导致程序崩溃

时间:2016-03-21 15:31:58

标签: c

我目前正在尝试释放已分配的内存,但这样做会导致程序崩溃。我是C和编程的新手,并且很乐意接受有关问题的帮助以及可能源于我缺乏经验的任何其他问题。

Pool* allocatePool(int x);
void freePool(Pool* pool);
void store(Pool* pool, int offset, int size, void *object);

typedef struct _POOL
{
    int size;
    void* memory;
} Pool;

int main()
{
    printf("enter the number of bytes you want to allocate//>\n");
    int x;
    Pool* p;
    scanf("%d", &x);
    p=allocatePool(x);
    freePool(p);
    return 0;
}

/* Allocate a memory pool of size n bytes from system memory (i.e., via malloc()) and return a pointer to the filled data Pool structure */

Pool* allocatePool(int x)
{
    static Pool p;
    p.size = x;

    p.memory = malloc(x);
    printf("%p\n", &p);

    return &p;//return the address of the Pool
}

/* Free a memory pool allocated through allocatePool(int) */
void freePool(Pool* pool) 
{
    free(pool);
    printf("%p\n", &pool);
}

1 个答案:

答案 0 :(得分:3)

您必须释放已分配的相同内存。这里:

p.memory = malloc(x);

您将x个字节分配给p.memory。这意味着:

free(pool);
printf("%p\n", &pool);

你应该释放相同的记忆。您尝试free池对象,但不会在堆上分配。在您的实现中,它是一个包含单个池的静态对象。尝试在堆上分配的free内存是未定义的行为,在你的情况下崩溃。

上面的代码也显示了对free的另一种误解:它没有改变分配内存的句柄。它只将先前分配的字节标记为可再次使用。您的程序必须防止通过其内存为free d。

的指针访问内存

此外,&pool不是池对象的地址,而是本地指针变量pool的地址。

要修复崩溃,请将您的功能更改为:

void freePool(Pool *pool) 
{
    if (pool) free(pool->memory);
}