2014-02-27 45 views
0
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

要修复由于'malloc'造成的内存泄漏,只需跟踪所有'malloc'并在使用后释放所有内存'malloc'。这意味着如果'免费(新)'不能解决你的问题,那么问题就在别处。请解释其余的代码。 –

+0

@MadHatter:所以** new **是在if-else语句之后使用的,是不是我应该放置free(new)的地方? –

+0

是什么让你说这是内存泄漏?通常当你没有正确地释放内存时会发生泄漏 - 这是你在队列中创建一个项目,这没关系。你如何从队列中删除东西 - 我怀疑这是问题所在。 – Floris

回答

1

我不认为这个函数有内存泄漏。该函数的工作是分配一个新的队列节点,以便该项目可以添加到队列的末尾 - 因此,只有在从队列中拉出时(大概在您写入的另一个函数中)才应该释放该队列节点。

在此函数中调用free()会造成内存损坏,其中您添加的项目将指向无效内存。

一旦您检索到可以返回的queue_item,您应该在您的pull_from_queue()(或类似的)函数中调用free()

2

它看起来像你正在创建一个链表,并且insert_queue()函数将一个元素添加到该列表中。这意味着在你调用这个函数10次之后,应该有一个内存中有10个元素的队列。这个想法是,你可以在程序中的其他地方使用这个队列。

如果清理了insert_queue()中的所有分配的内存,那么您将无法增加队列。内存泄漏是在您完成处理之后将其排除在外的任何位置。如果你什么都不做,那么这10个元素就会在内存中一直存在,直到你的整个程序退出。

你应该做两件事。在您的remove_queue()函数(从队列中移除元素的函数)中,您应该在移除的节点上调用free()。而且,如果队列在您完成之后不是空的,那么您应该对所有剩余的元素调用remove_queue(),以确保将占用的内存返回给系统。

0

这个功能没有记忆韭菜。您应该在将元素从队列中移除的函数中释放()内存。

另一种方法是元素从remove_queue()这样的存储器管理(分配/释放)发生在上方的insert_queue() & remove_queue()功能的相同电平返回到已经构造的元素传递给insert_queue()和也可用内存。