free()在C中的使用
我正在做一些C练习(新手),我遇到了一点问题。我得到了一个先进先出队列,并被告知将remove函数修改为FILO 当我省略自由((void*)p时,这很好用;在while循环中,我从前面的方法中获取了这一行。有人能告诉我为什么这条线在那里不起作用吗?我猜我不能完全删除它,因为内存泄漏free()在C中的使用,c,malloc,free,C,Malloc,Free,我正在做一些C练习(新手),我遇到了一点问题。我得到了一个先进先出队列,并被告知将remove函数修改为FILO 当我省略自由((void*)p时,这很好用;在while循环中,我从前面的方法中获取了这一行。有人能告诉我为什么这条线在那里不起作用吗?我猜我不能完全删除它,因为内存泄漏 /* remove next Item from queue, placing it in the 2nd argument; * return 1/0 if successful/queue empty */
/* remove next Item from queue, placing it in the 2nd argument;
* return 1/0 if successful/queue empty */
int q_remove(Queue *q, Item i) {
struct q_element *p;
if (q->head == NULL)
return 0;
if(q->head==q->tail){
p=q->head;
q->head=NULL;
q->tail=NULL;
memcpy(i, p->value, q->size);
free(p->value);
free((void *) p);
return 1;
}
p=q->head;
while(p != NULL){
if(p->next==q->tail){
memcpy(i, p->next->value, q->size);
free(p->next->value);
q->tail=p;
q->tail->next=NULL;
free((void *) p);
return 1;
}
p=p->next;
}
return 0;
}
在我看来,您正在释放
p
,但在此之前,您将p
的值分配给q->tail
,使q->tail
指向即将失效的内存。你实际上是在释放q->tail
在其他地方,我怀疑你使用了
q->tail
,这会让你的操作系统发出尖叫,并像滚轴上的地狱一样杀死你的程序。在我看来,你似乎在释放p
,但在此之前,将p
的值赋给q->tail
使q->tail
指向即将失效的内存。你实际上是在释放q->tail
在其他地方,我怀疑你使用了
q->tail
,这会让你的操作系统发出尖叫,并像轮滑机上的地狱一样杀死你的程序。问题是你在下一个代码行中指向了你要释放的东西:
q->tail=p;
...
free((void *) p);
现在,当您尝试访问q->tail时,会出现一个错误,因为您已经释放了这个内存
您应该尝试使用free p->next而不是p(因为p->next是您队列中的最后一项,所以这是您要取出的项)
祝你好运:)问题是你在下一行代码中指向了你要释放的东西:
q->tail=p;
...
free((void *) p);
现在,当您尝试访问q->tail时,会出现一个错误,因为您已经释放了这个内存
您应该尝试使用free p->next而不是p(因为p->next是您队列中的最后一项,所以这是您要取出的项)
祝你好运:)台词:
q->tail->next=NULL;
free((void *) p);
…应该是
free( free( (void *) p->next );
p->next=NULL;
因为您并不是要释放“p”(这是您的新“tail”),而是要释放元素p->next,它是您的旧tail。释放指针后,将其设置为null。值q->tail已经指向'p',在之后释放'p'是无效的,因为'p->next'是您试图删除的
可能就是这样
另外,我个人不喜欢您将'Item'键入为void*的方式,因为'Item'看起来像堆栈上的传递值变量,所以它看起来很混乱
Kev线路:
q->tail->next=NULL;
free((void *) p);
…应该是
free( free( (void *) p->next );
p->next=NULL;
因为您并不是要释放“p”(这是您的新“tail”),而是要释放元素p->next,它是您的旧tail。释放指针后,将其设置为null。值q->tail已经指向'p',在之后释放'p'是无效的,因为'p->next'是您试图删除的
可能就是这样
另外,我个人不喜欢您将'Item'键入为void*的方式,因为'Item'看起来像堆栈上的传递值变量,所以它看起来很混乱
Kev很抱歉,这无法编译。请提供您所引用的代码,不做任何修改。请删除对(void*)的强制转换,调用free()时不需要这些转换。很抱歉,这无法编译。请提供您所引用的代码,不做任何修改。请删除对(void*)的强制转换,调用free()时不需要这些转换。