2014-12-30 48 views
0

我有一個大型數組,我使用realloc()擴展它,並使用valgrind來查看內存使用情況。valgrind報告奇怪的內存使用情況

這裏是最小的例子:

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

#define PASSES  1024 * 2 

#define MEMTOALLOC 1024 * 1024 

int main(void) { 
    void *remem = NULL; 
    void *newmem; 

    const unsigned int chunk = MEMTOALLOC/PASSES; 

    unsigned int i; 
    for(i = 0; i < PASSES; i++){ 
    const unsigned int size = (i + 1) * chunk; 
    newmem = realloc(remem, size); 
    if (newmem == NULL){ 
     printf("No memory!\n"); 
     exit(1); 
    } 
    remem = newmem; 

    if (i % 1000 == 0) 
     printf("%10u processed\n", i); 
    } 

    free(remem); 
} 

如果道次1,程序立刻realloc的一切,Valgrind的報告:

total heap usage: 1 allocs, 1 frees, 1,048,576 bytes allocated 

如果道次100,逐步與100個reallocs和Valgrind的程序的realloc報告:

total heap usage: 100 allocs, 100 frees, 52,949,250 bytes allocated 

如果我做PASSES 1024,我會得到巨大的消耗:

total heap usage: 1,024 allocs, 1,024 frees, 537,395,200 bytes allocated 

這是什麼內存使用情況的解釋?

+0

您還沒有任何代碼。你沒有任何問題。您希望在回覆您的帖子時看到什麼? –

+0

代碼並不是真的需要,但我會編輯我的問題。 – Nick

+2

這種情況下,您可以通過嘗試創建** [MCVE](http://stackoverflow.com/help/mcve)**來解決自己的問題。 – user3386109

回答

1

PASSES爲100的情況下,您有chunk = 10485
你正在做的分配是

i+1  size 
    1  10485 
    2  20970 
    3  31455 
...  ... 
100 1048500 

您最多可以添加所有的尺寸,或者如果你知道的1到100的總和

100 * 101/2 = 5050 

,那麼你可以很容易地計算出總的內存分配爲

5050 * 10485 = 52,949,250 

這正是valgrind報告的內容。這並不是說你在任何特定時間分配了52MB。只有在程序生命週期中從realloc請求的總內存爲52MB。

如果PASSES是1024,然後chunk = 1024,且計算

(1024 * 1025/2) * 1024 = 537,395,200 

同樣,你永遠不會比在任何特定時間分配1MB多,但內存從realloc申請的總額爲537MB。

+0

我明白了。那麼只有一個問題 - 如何在高峯期看到內存消耗總量? – Nick

+0

@Nick試試'valgrind --tool = massif'。 http://valgrind.org/docs/manual/ms-manual.html – user3386109

+0

謝謝。我試過這個,結果比我預想的要低,我感到困惑。 – Nick