gpt4 book ai didi

c - 疯狂是免费的()

转载 作者:太空狗 更新时间:2023-10-29 14:57:59 24 4
gpt4 key购买 nike

在我的简单 C 程序 (gnu linux) 中,我从 proc/stat 获取 rss 值。
int GetRSS() 从我的进程的 proc/stat 返回 RSS 值。


在这种情况下:

printf("A RSS=%i\n", GetRSS());
char *cStr = null;
cStr = malloc(999999);
if (cStr != NULL)
{
printf("B RSS=%i\n", GetRSS());
free(cStr);
printf("C RSS=%i\n", GetRSS());
}

我得到:

A RSS=980
B RSS=984
C RSS=980

我无法解释为什么 C 没有返回 984


如果我运行相同的过程两次,我会得到:

A RSS=980
B RSS=984
C RSS=980
B RSS=984
C RSS=980

看起来不错。


但是,在这种情况下:

struct _test
{
char *pChar;
}
struct _test **test_ptr;

int i = 0;
printf("D RSS=%i\n",GetRSS());
assert(test_ptr = (struct _test **)malloc( (10000) * sizeof(struct _test *)));

for (i = 0; i < 1000; i++)
{
assert(test_ptr[i] = (struct _test *)malloc(sizeof(struct _test)));
test_ptr[i]->pChar=strdup("Some garbage");
}

printf("E RSS=%i\n", GetRSS());

for (i=0; i<1000; i++)
{
free(test_ptr[i]->pChar);
free(test_ptr[i]);
}

free(test_ptr);
printf("F RSS=%i\n", GetRSS());

我得到:

D RSS=980
E RSS=1024
F RSS=1024
D RSS=1024
E RSS=1024
F RSS=1024

嗯?为什么这里没有释放内存?

最佳答案

内存块已被释放的事实并不必然使该 block 最适合后续分配。内存管理器有几种选择内存块的策略(最佳匹配、最差匹配、最先匹配)。

大多数内存管理器也尝试合并空闲 block ,但有些人试图让空闲 block 在合并之前尽可能“老化”,理论上随着它们老化,它们旁边的 block 也更有可能被释放,提高合并 block 的成功率(从而减少碎片)。

该 block 未用于满足您的下一个分配请求的事实意味着它没有被释放。

关于c - 疯狂是免费的(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7522284/

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