此代码导致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
}
答案 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而且可以调整(尽管我不记得究竟如何)。