C - 我的记忆释放功能有什么问题?

时间:2015-03-12 19:20:38

标签: c pointers memory-management struct free

我有一个包含2个整数和指向另一个结构的指针的结构。我首先为struct分配内存然后为指针分配内存。当我释放内存时,我首先释放指针,然后释放结构。

当我运行程序并调用释放内存的函数时,它会在调用时崩溃。当我不调用释放内存的函数时它工作正常,但是我没有释放内存。

我尝试删除释放分配给指针的内存的行,并且程序不会崩溃,但我不认为这是正确的,因为每个“malloc / calloc”都需要“free”吗?任何人都认为释放功能有问题吗?

//Define a struct data type
struct q_element
{
    //Declaration of struct members
    int element;
    int priority;
    struct q_element *next_element;
};

//Method to allocate memory
struct q_element* allocateStruct()
{
    //Declaration of a variable
    struct q_element *e;

    //Allocate memory for one queue element
    e = malloc(sizeof(struct q_element));

    //Allocate memory for one pointer to a queue element
    e->next_element = calloc(1,sizeof(struct q_element*));

    //Initialize integer members of queue element
    e->element = 0;
    e->priority = 0;

    return e;
}

//Method to free memory allocated
void freeStruct(struct q_element* e)
{
    //Free up pointer member
    free(e->next_element);

    //Free up struct
    free(e);
}

4 个答案:

答案 0 :(得分:5)

您不需要为next_element指针分配内存。指针已经存在,就像int element一样。

因此,如果您只想分配一个元素,可以将next_element指针设置为NULL,一切都很好。

答案 1 :(得分:4)

您没有为行中的e->next_element分配足够的内存:

e->next_element = calloc(1,sizeof(struct q_element*));
                                             //  ^^^ remove the *

应该是:

e->next_element = calloc(1,sizeof(struct q_element));

如果你使用e->next_element就像它是一个有效的指针一样,你最有可能最终访问了你没有分配的内存。这会破坏calloc创建的部分簿记信息,这会在您致电free时导致问题。

答案 2 :(得分:1)

//Allocate memory for one pointer to a queue element
e->next_element = calloc(1,sizeof(struct q_element*));

为指向q_element结构的指针分配空间,而不是q_element结构。你是否试图写这个结构,因为如果是这样,那可能就是它出错了。

作为旁注,你可能会做得更好

e->next_element = 0

allocate_struct内,然后在函数外部执行e->next_element = allocate_struct()

答案 3 :(得分:1)

除了其他人提到的有关分配的内容之外,您还需要一个哨兵来检查next_element是否已被释放。你可能正在尝试双重免费。

请尝试以下代码:

void freeStruct(struct q_element* e)
{
    //Free up pointer member
    if(e->next_element != 0){
        free(e->next_element);
        e->next_element = 0;
    }

    //Free up struct
    free(e);
}
相关问题