为什么在重新分配小块时分配大块内存会失败

时间:2015-04-04 22:36:57

标签: c++ linux malloc

此代码导致x指向大小为100GB的内存块。

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

int main() {
    auto x = malloc(1);
    for (int i = 1; i< 1024; ++i) x = realloc(x, i*1024ULL*1024*100);
    while (true); // Give us time to check top
}

虽然此代码无法分配。

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

int main() {
    auto x = malloc(1024ULL*1024*100*1024);
    printf("%llu\n", x);
    while (true); // Give us time to check top
}

2 个答案:

答案 0 :(得分:1)

嗯,你在成功的内存中分配更少的内存:

for (int i = 1; i< 1024; ++i) x = realloc(x, i*1024ULL*1024*100);

最后realloc是:

x = realloc(x, 1023 * (1024ULL*1024*100));

与:相比:

auto x = malloc(1024 * (1024ULL*100*1024));

也许这就是你的记忆界限 - 最后100M打破了骆驼的背部?

答案 1 :(得分:1)

我的猜测是,系统的内存大小小于您尝试分配的100 GiB。虽然Linux确实过度使用内存,但它仍然无法满足超出其要求的要求。这就是第二个例子失败的原因。

另一方面,第一个例子的许多小增量低于该阈值。所以每个人都成功,因为内核知道你还没有需要任何先前的记忆,所以它没有迹象表明它无法支持那100个额外的MiB。

我认为来自进程的内存请求失败的阈值是相对于可用的RAM而且可以调整(尽管我不记得究竟如何)。