修复内存泄漏时遇到问题

时间:2014-02-27 05:27:23

标签: c memory-leaks free

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

我很难在此功能中修复内存泄漏。我尝试在功能结束时免费(新),但它仍然没有修复泄漏。我应该在哪里发表这个声明?

3 个答案:

答案 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()功能。