gpt4 book ai didi

c - 用C写一个内存管理函数?

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:22 25 4
gpt4 key购买 nike

在我最初的 C 程序中,我注意到我经常调用 free,所以我想制作一个调用一次的函数来释放所有内容。此代码是否是执行此操作的有效方法,或者是否有任何其他改进建议?

#include <stdio.h>
#include <stdlib.h>

void *items_to_free[1024];
int intItemsToFree = 0;

void mm_init(void)
{
int i;

for (i = 0; i < 1024; i++)
{
items_to_free[i] = NULL;
}
}

void mm_release(void)
{
int i;

for (i = 0; i < 1024; i++)
{
if (items_to_free[i])
{
printf("Freeing %p\n", items_to_free[i]);
free(items_to_free[i]);
items_to_free[i] = NULL;
}
}
}

void mm_add(void *p)
{
items_to_free[intItemsToFree++] = p;
}


int main(void)
{
int *i = NULL;

/* initialize memory management */
mm_init();

/* allocate something */
i = (int *) malloc(sizeof(int) * 10);

/* add it to the memory collection */
mm_add(i);

/* run program as usual */
printf("App doing something...");

/* at the end, free all memory */
mm_release();

return 0;
}

输出:

App doing something...Freeing 0x100103b30

最佳答案

虽然对于一个简单的应用程序来说,这似乎是个好主意,但实际上并非如此。让我们考虑两种情况:

1) mm_release 在程序终止时被调用

这意味着 mm_release 完全没有用,而且是在浪费时间。几十年前的任何操作系统都会为你清理内存。自己一点一点地做只是浪费时间。

2) mm_release 在中间某处被调用

这意味着 mm_release 必须专门化。您在执行过程中释放了内存,因为您已经用完了一些内存,并且您想要将其归还,以便它可以在程序的其他地方使用。 mm_release 必须提供关于什么应该发布什么不应该发布的确切信息。这正是 free 所做的。


如您所见,mm_release 确实对您毫无帮助。在第一种情况下,它是无用的,您可以简单地摆脱它。在第二种情况下,您最好直接使用 free,因为无论如何您都是有选择地释放内存。

另请注意,您的方法对线程非常友好。


您可能认为 mm_release 可以将分配的内存分组到相关的集合中,您可以通过一次调用释放一组中的所有内存。虽然这可能 看起来很有吸引力,但在现实中它又是毫无用处的。首先,实际上要么您没有很多语义相似的内存分配,因此可以将它们分组,或者如果您这样做,那么它们已经放在一个数组或等效物中。

因此,要么内存集只有单个元素(这意味着您不会通过使用此方法获得任何好处),要么只是以不必要的复杂库为代价避免 for 循环。


最后但同样重要的是,内存与许多其他资源一样,是同一系统中的一种资源。您一个一个打开文件,一个一个关闭它们。您一个接一个地获取信号量,然后一个接一个地释放它们。你一根一根地打开管道,一根一根地关闭它们。哎呀,你甚至一个一个地打开 { 并用 } 一个一个地关闭它。为内存做个异常(exception)是没有意义的。

其实以前有一些很怕内存的人试过你的方法。他们称之为垃圾收集器,这是对资源管理规律性的侮辱。 (这些人也非常害怕指针和一般的编程)

关于c - 用C写一个内存管理函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20526090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com