首页 文章

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

提问于
浏览
1

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

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

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

//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 回答

  • 5

    你没有为行中的 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 时会导致问题 .

  • 1

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

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

  • 4

    //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() .

  • 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);
    }
    

相关问题