2013-11-15 57 views
3

我正在寫一個strcat版本,可以根據輸入字符串的大小分配內存。爲此,我使用realloc。Valgrind報告使用的內存是巨大的

我一直在做很多字符串測試。在一些連接9,193個字符串的測試中,會產生長度爲64,344的字符串。我Valgrind的檢查,但我發現結果有點令人不安......

HEAP SUMMARY 
    in use at exit: 0 bytes in 0 blocks 
    total heap usage: 9193 allocs, 9,193 frees, 338,017,768 bytes allocated 

All heap blocks were freed -- no leaks are posible 

For counts of detected and suppressed errors, rerun with -v 
ERROR SUMMARY: 0 Errors form 0 contexts (suppresed: 0 from 0) 

程序運行良好,在我看來足夠快,但我擔心與分配的消息338017768個字節,我覺得it'對於一個簡單的字符串連接而言太多了。

「分配的字節」究竟意味着什麼?

謝謝。

+0

這意味着您平均每次調用「malloc()'等時分配了大約36 KiB。既然你知道一些分配是在64 KiB的區域,這看起來不算太壞。而且你把它全部釋放了,所以你可能沒有什麼可擔心的。正如已經指出的(通過一些答案),它並不意味着你的程序增長到300+ MiB。 –

回答

3

這是如果從未調用free,程序將分配的內存量。它與峯值內存使用量無關。

您可以通過這樣得到同樣的結果:

for (int i = 0; i < 338017768; ++i) { 
    free(malloc(1)); 
} 
+0

感謝您的回答。所以..這意味着要創建(或多或少)65 kB字符串,該程序在其執行中使用了338 MB? – user1274605

1

,可以有兩方面的原因:

一)取決於你如何連接字符串的標準程序是:

allocate enough memory to hold the concatenation 
copy both strings into it 
deallocate memory occupied by the initial strings 

如果你用很多字符串做這個,那麼它將分配appx n^2內存,其中n是結果字符串的長度。

b)並非所有被分配的內存都被實際使用,緩衝區通常被分配得更大,然後它們需要被分配。並不是所有實際分配的內存都會附加物理內存。這是處理虛擬內存的標準方式。

如果I malloc 1 GB的內存,我的進程實際上不會消耗那麼多物理RAM,直到我開始使用它。它將以按需方式以系統頁面塊的形式提供。