2015-04-04 96 views
3

此代码导致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

第二个代码如何失败?这只是分配没有显示在顶部?无论如何,我强烈建议检查'malloc()'和'realloc()'的返回值,以查看您的'malloc()'实现是否由于某种原因被释放。 – cmaster 2015-04-05 23:24:03

+0

@cmaster我会在一分钟内编辑该问题。但是我在第二个例子中添加了一个检查并且'x'为空。但是,是的,它并没有出现在'top' – 2015-04-05 23:32:46

回答

1

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

另一方面,第一个例子的许多小增量低于该阈值。所以它们中的每一个都成功了,因为内核知道你不需要任何先前的内存,所以它没有迹象表明它不能够支持这100个额外的MiB。

我相信,当一个进程的内存请求失败时的阈值是相对于可用的RAM,并且可以调整(尽管我不记得具体如何)。

+0

为了记录,我有16GiB的RAM和8GiB的交换。 – 2015-04-05 23:49:45

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)); 

也许这是正义t你的记忆界限在哪里 - 最后一个打破骆驼背部的100M?

+0

好猜中;)但是我把它改成了'i <= 1024',它仍然有效。 – 2015-04-04 22:48:27