void insert_queue (queue_ref queue, queue_item_t item) {
queuenode_ref new = malloc(sizeof (struct queuenode));
assert(new != NULL);
new->item = item;
new->link = NULL;
if (!isempty_queue(queue)) {
queue->rear->link = new;
queue->rear = new;
} else {
queue->front = new;
queue->rear = new;
}
}
我很难在此功能中修复内存泄漏。我尝试在功能结束时免费(新),但它仍然没有修复泄漏。我应该在哪里发表这个声明?
答案 0 :(得分:2)
看起来您正在创建链接列表,而insert_queue()函数会向该列表添加元素。这意味着在您调用此函数10次之后,内存中应该有一个队列,其中包含10个元素。我们的想法是,您可以在程序中的其他位置使用此队列。
如果清理insert_queue()中的所有已分配内存,则无法扩展队列。内存泄漏是在您完成任务后摆脱队列的任何地方。如果你什么也不做,那么这10个元素将在内存中流传,直到整个程序退出。
你应该做两件事。在remove_queue()函数(从队列中删除元素的函数)中,应该在已删除的节点上调用free()。而且,如果队列在你完成时没有为空,那么你应该对所有剩余的元素调用remove_queue(),以确保你将它们占用的内存返回给系统。
答案 1 :(得分:1)
我不认为此功能存在内存泄漏。该函数的工作是分配一个新的队列节点,以便可以将该项添加到队列的末尾 - 因此,只有在从队列中拉出时才会释放它(可能是在您编写的另一个函数中)。
在此函数中调用free()
会导致内存损坏,您添加的项目将指向无效内存。
一旦检索到queue_item准备好返回,就应该在free()
(或类似)函数中调用pull_from_queue()
。
答案 2 :(得分:0)
此功能中没有记忆韭菜。你应该在从队列中删除元素的函数中释放()内存。
另一种方法是将已构造的元素传递给insert_queue()
,并为remove_queue()
返回的元素释放内存,这样的内存管理(分配/免费)发生在{{1}以上的同一级别上}& insert_queue()
功能。