2013-11-15 1 views
3

Я пишу версию strcat, которая может выделять память соответственно размеру входной строки. Для этого я использую realloc.Используемая память, сообщенная Valgrind, является HUGE

Я делал несколько тестов с большим количеством строк. В некоторых тестах, объединяющих 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) 

программа работает хорошо и быстро благоугодно на мой взгляд, но я волнуюсь с 338,017,768 байт, выделенных сообщение, я думаю it' слишком много для простой конкатенации строк.

Что означает «выделенные байты» точно?

Спасибо.

+0

Это означает, что в среднем вы выделили около 36 KiB за вызов 'malloc()' et al. Поскольку вы знаете, что некоторые из ассигнований были в области 64 KiB, это выглядит не так уж плохо. И вы освободили все это, поэтому вам, вероятно, не о чем беспокоиться. Как уже указывалось (по некоторым ответам), это автоматически не означает, что ваша программа выросла до 300+ MiB. –

ответ

3

Это объем памяти, который был бы выделен вашей программой, если бы он никогда не звонил free. Это не имеет никакого отношения к использованию пиковой памяти.

Вы можете получить тот же результат, делая это:

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

Спасибо за ваш ответ. Итак .. это означает, что для создания (более или менее) строки 65 кбайт в программе используется 338 МБ ??? – 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) Не вся память, которая получает выделенное, фактически используется, буферы часто выделяются больше, чем они должны быть. И не вся память, которая выделяется, когда-либо получает физическую RAM, прикрепленную к ней. Это стандартный способ работы с виртуальной памятью.

Если I malloc 1 ГБ памяти, мой процесс фактически не будет потреблять столько физической памяти, пока я не начну использовать его. Он будет предоставляться в кусках системных страниц по требованию.