我已经在这个项目上工作了五个月了。它是传感器网络的实时应用。我在程序的生命周期中创建了几个链表,并使用malloc在链接中创建了一个新节点。会发生什么事情,程序突然停止或疯狂并重新启动。我使用AVR和微控制器是ATMEGA 1281.经过大量调试后我发现malloc导致问题。退出创建新链接的函数后,我不释放内存,所以我猜这最终导致堆内存溢出或类似的东西。现在如果我使用free()函数使用malloc在函数末尾释放内存,当控件到达free()时程序就会卡住。这是因为在调用free()之后内存变得过于集群了吗?
我还创建了参考表,例如,如果'head'是一个新的链接列表,我创建另一个名为current的列表并使其等于head。
table *head;
table *current = head;
如果我使用免费的
,函数结束后free(current);
current = NULL:
然后程序卡在这里。
我不知道该怎么做。我究竟做错了什么?有没有办法增加堆内存的大小?
答案 0 :(得分:2)
是否需要在函数结束时释放一个块,调用malloc()应该由调用后是否仍然使用内存块来确定。如果它正在成为列表中的节点,那么您应该不在函数末尾释放它。如果它在通话期间用于临时工作记忆,那么你必须在结束时释放它,否则你最终会耗尽你的堆。从列表中删除块时必须释放该块。
在任何情况下,在实时系统(无虚拟内存)中的小内存块(即链接列表操作)上使用malloc()和free()将导致最终的堆碎片。
您需要做的是使用内存块池并回收缓冲区。你在运行RTOS还是裸机?如果你看,有现有的内存池库可用。你也可以写一个,但除非你真的有这方面的经验,否则创建比没有图书馆更糟糕的东西相对容易。
如果您需要更具体的建议,请提供更多详细信息。