在C语言中创建独立的堆

3

我正在开发一个动态分配内存量较大的函数,但是如果这个函数超过了时间阈值,计时器就会触发。因此,我们需要释放在开始此函数时分配的所有内存。

我们使用第三方工具创建堆池来进入该函数。因此,任何动态内存分配都将从该堆池中进行。 如果计时器触发,我们只需要释放该堆池,代码继续使用之前的堆池(它就像一组堆栈)。

由于成本原因,我们需要停止使用这个第三方工具。

有没有人对这个问题有解决方案来替换这个第三方工具?

注意:这不是一个多线程系统。

提前感谢。


1
堆栈分配是一个选项吗?也就是说,您正在开发的函数是否总是在堆栈顶部执行?如果是的话,在计时器事件中,您只需要通过将控制传递到其结尾来终止函数执行。 - hidefromkgb
1
如果您能展示该函数的代码,那将会更好。 - klutt
这个描述太过模糊,难以回答。根据你的描述,这是一个多线程系统,因此可以让每个线程管理自己的分配和清理工作。 - Lundin
我认为你只是在基本上寻找一个池分配器。你可以在 github 上找到一些库。 - KamilCuk
2个回答

2
你可以从堆中获取一个大的内存块,并编写自己的分配器和释放器。如果计时器触发,你可以释放整个块。
当然,这将需要深入了解malloc和free的工作原理。你需要知道存储在内存头部的信息是什么以及如何处理它。最初的回答。

1
您可以使用指针集合来存储在函数期间分配的所有内存的指针,时间结束时,您可以遍历并释放它们。(您可以将任何指针存储为void*,因此这是可能的) 这样做的好处是您不必手动编写malloc和free。如果您想更像您正在使用的工具,您可以分配一个大块内存,然后实现自己的malloc和free版本,返回指向您块中“空闲”部分的指针。这样做的好处是当您离开函数时只需执行一次free,但代价是实现更加复杂(考虑到您可能会耗尽内存并且必须手动避免碎片)。我建议您采用第一种方法。

我认为第三方工具使用了第一种方法;你能详细说明如何实现这种方法吗? - mnabil
当您需要malloc时,可以使用void*的动态列表,然后将指针保存在列表中。一旦时间耗尽(或函数结束),您就可以释放动态列表中保存的每个指针。通过这种解决方案,您还可以拥有每个线程的列表,从而使您能够以较小的开销进行多线程处理。为了实现动态列表,建议您使用链表,这样可以实现O(1)插入,因为您不需要访问单个指针,只需要整个列表即可。请记住,您不能两次释放内存。 - Maxim Irrigad
如果你在函数中释放内存,但并非全部释放,必须记住从指针列表中删除所有需要释放的内存。如果你进行多次分配和释放操作,请不要使用链表,因为O(n)搜索会非常耗费时间。 - Maxim Irrigad
我将进行许多分配和释放操作。因此,在这种情况下,有什么比链表更好的选择呢? - mnabil
我会使用可通过红黑树实现的集合。如果以这种方式完成,则插入和删除的复杂度为O(log(n))。您还可以考虑使用hashmap,最好能够进行O(1)操作。但请考虑寻找一个可行的实现,实现集合可能并不容易,并且有许多免费资源可用,这些资源经过多年的强化测试。 - Maxim Irrigad
另一个好的想法是从分配返回void**并继续使用链表,这样你可以释放并设置为空,因为free(0)是无操作的,这样你就没有集合的开销,同时仍然保留O(1)的分配。请记住,如果未完全删除的分配数量最终填满了太多内存,这种解决方案可能不适合您。但是,您可以定期清除死节点的链表。 - Maxim Irrigad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接