繁体   English   中英

Free()函数导致程序崩溃

[英]Free() function causes program to crash

我目前正在尝试释放已分配的内存,但这样做会导致程序崩溃。 我是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);
}

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

p.memory = malloc(x);

你将x字节分配给p.memory 这意味着:

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

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

上面的代码还显示了另一个关于free误解:它没有改变分配内存的句柄。 它只将先前分配的字节标记为可再次使用。 你的程序必须防止通过你的内存free的指针访问内存。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM