【发布时间】:2015-05-15 02:58:01
【问题描述】:
我有一个结构,它包含 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上递归应用freeStruct而不是free(但它应该是尾递归)。 -
您确定在释放后不使用释放的内存吗?但是您的结构可疑地类似于某些链表(队列?)项目,在这些项目中,这种分配释放可能会成为问题的根源。
-
e->next_element = calloc(1,sizeof(struct q_element*));-->e->next_element = NULL;,free(e->next_element);free(e);-->if(e){freeStruct(e->next_element);free(e);} -
如果你只释放一个结构,函数本身并没有错。但是我的猜测是这些是用来组成一个列表的,而你释放整个列表的代码是错误的,但由于它不在这里,我们看不到它。
-
是的,它用于优先级 q 队列,每当我弹出队列中最高优先级的元素时,我都会调用
freeStruct函数以释放弹出元素占用的内存。我只释放一个一次,而不是一个 for 循环中的整个列表@LeeDanielCrocker
标签: c pointers memory-management struct free