C - 我的内存释放功能有什么问题?
C - What is wrong with my memory freeing function?
我有一个包含 2 个整数和一个指向另一个结构的指针的结构。我首先为结构分配内存,然后为指针分配内存。当我释放内存时,我先释放指针,然后释放结构。
当我 运行 我的程序并调用释放内存的函数时,它在调用时崩溃。当我不调用释放内存的函数时它工作正常,但我没有释放内存。
我尝试删除释放分配给指针的内存的行并且程序没有崩溃,但我认为那是不对的,因为每个 "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);
}
您没有为行中的 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
.
时会导致问题
在
//Allocate memory for one pointer to a queue element
e->next_element = calloc(1,sizeof(struct q_element*));
您为指向 q_element 结构而不是 q_element 结构的指针分配了 space。您是否尝试写入此结构,因为如果是这样,那可能就是出错的地方。
作为旁注,你最好只做
e->next_element = 0
在 allocate_struct
内部,稍后在函数外部执行 e->next_element = allocate_struct()
。
您不需要为 next_element
指针分配内存。指针已经存在,例如 int element
。
所以如果你只想分配一个元素,你可以将next_element
指针设置为NULL
,一切都很好。
除了其他人提到的分配之外,您还需要一个哨兵来检查 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);
}
我有一个包含 2 个整数和一个指向另一个结构的指针的结构。我首先为结构分配内存,然后为指针分配内存。当我释放内存时,我先释放指针,然后释放结构。
当我 运行 我的程序并调用释放内存的函数时,它在调用时崩溃。当我不调用释放内存的函数时它工作正常,但我没有释放内存。
我尝试删除释放分配给指针的内存的行并且程序没有崩溃,但我认为那是不对的,因为每个 "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);
}
您没有为行中的 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
.
在
//Allocate memory for one pointer to a queue element
e->next_element = calloc(1,sizeof(struct q_element*));
您为指向 q_element 结构而不是 q_element 结构的指针分配了 space。您是否尝试写入此结构,因为如果是这样,那可能就是出错的地方。
作为旁注,你最好只做
e->next_element = 0
在 allocate_struct
内部,稍后在函数外部执行 e->next_element = allocate_struct()
。
您不需要为 next_element
指针分配内存。指针已经存在,例如 int element
。
所以如果你只想分配一个元素,你可以将next_element
指针设置为NULL
,一切都很好。
除了其他人提到的分配之外,您还需要一个哨兵来检查 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);
}