【问题标题】:Problem with using malloc in linked lists在链表中使用 malloc 的问题
【发布时间】:2010-06-02 01:22:49
【问题描述】:

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

我还创建引用表,例如,如果“head”是一个新链接列表,我创建另一个名为 current 的列表并使其等于 head。

table *head;
table *current = head;

如果我使用free,函数结束后

free(current);
current = NULL:

然后程序就卡在这里了。

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

【问题讨论】:

    标签: c memory-management malloc linked-list


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 2020-12-10
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      相关资源
      最近更新 更多