2015-04-04 66 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