在链表中使用malloc的问题

时间:2010-06-02 01:22:50

标签: c memory-management malloc linked-list

我已经在这个项目上工作了五个月了。它是传感器网络的实时应用。我在程序的生命周期中创建了几个链表,并使用malloc在链接中创建了一个新节点。会发生什么事情,程序突然停止或疯狂并重新启动。我使用AVR和微控制器是ATMEGA 1281.经过大量调试后我发现malloc导致问题。退出创建新链接的函数后,我不释放内存,所以我猜这最终导致堆内存溢出或类似的东西。现在如果我使用free()函数使用malloc在函数末尾释放内存,当控件到达free()时程序就会卡住。这是因为在调用free()之后内存变得过于集群了吗?

我还创建了参考表,例如,如果'head'是一个新的链接列表,我创建另一个名为current的列表并使其等于head。

table *head;
table *current = head;

如果我使用免费的

,函数结束后
free(current);
current = NULL:

然后程序卡在这里。

我不知道该怎么做。我究竟做错了什么?有没有办法增加堆内存的大小?

1 个答案:

答案 0 :(得分:2)

是否需要在函数结束时释放一个块,调用malloc()应该由调用后是否仍然使用内存块来确定。如果它正在成为列表中的节点,那么您应该在函数末尾释放它。如果它在通话期间用于临时工作记忆,那么你必须在结束时释放它,否则你最终会耗尽你的堆。从列表中删除块时必须释放该块。

在任何情况下,在实时系统(无虚拟内存)中的小内存块(即链接列表操作)上使用malloc()和free()将导致最终的堆碎片。

您需要做的是使用内存块池并回收缓冲区。你在运行RTOS还是裸机?如果你看,有现有的内存池库可用。你也可以写一个,但除非你真的有这方面的经验,否则创建比没有图书馆更糟糕的东西相对容易。

如果您需要更具体的建议,请提供更多详细信息。