精神错乱是免费的()

Mar*_*rds 5 c malloc free structure dynamic

在我的简单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());
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

A RSS=980
B RSS=984
C RSS=980
Run Code Online (Sandbox Code Playgroud)

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


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

A RSS=980
B RSS=984
C RSS=980
B RSS=984
C RSS=980
Run Code Online (Sandbox Code Playgroud)

看起来很好.


但是,在这种情况下:

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());
Run Code Online (Sandbox Code Playgroud)

我明白了:

D RSS=980
E RSS=1024
F RSS=1024
D RSS=1024
E RSS=1024
F RSS=1024
Run Code Online (Sandbox Code Playgroud)

咦?为什么记忆不能在这里释放?

Jer*_*fin 5

该内存块已经被释放的事实并不能必然使该块最有资格获得后续分配.内存管理器有几种策略可以选择内存块(最适合,最差适合,首先适合).

大多数内存管理器也试图合并空闲块,但是有些人试图让空闲块在合并之前尽可能地"老化",理论上随着它们的老化,它们旁边的块也有更好的机会被释放,提高聚结块的成功率(从而减少碎片).

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