Я сделал минимально-рабочий пример того, как добавлять элементы в массив с realloc. Это будет расширено в будущей программе, в которой будет много других элементов.Realloc Использование слишком большого объема памяти
#include <stdio.h>//printf
#include <stdlib.h>//malloc, realloc
int main() {
//BEGIN REALLOCATE-ABLE ARRAY
unsigned int *array, loop_variable;
const unsigned int ORIGINAL_ARRAY_SIZE = 4, REALLOC_INDICES = 99;
array = malloc(ORIGINAL_ARRAY_SIZE*sizeof(unsigned int));
for (loop_variable = 0; loop_variable < ORIGINAL_ARRAY_SIZE; loop_variable++) {
array[loop_variable] = loop_variable;
}
//BEGIN REALLOCATION
for (loop_variable = 1; loop_variable < REALLOC_INDICES; loop_variable++) {
array = realloc(array,sizeof(unsigned int)*(ORIGINAL_ARRAY_SIZE+loop_variable));
array[ORIGINAL_ARRAY_SIZE+loop_variable-1] = 2*(ORIGINAL_ARRAY_SIZE+loop_variable-1);
printf("reallocate array[%d] = %d\n",ORIGINAL_ARRAY_SIZE+loop_variable-1,array[ORIGINAL_ARRAY_SIZE+loop_variable-1]);
}
//BEGIN PRINTING ARRAY VALUES
for (loop_variable = 0; loop_variable < ORIGINAL_ARRAY_SIZE+REALLOC_INDICES-1; loop_variable++) {
printf("array[%d] = %d\n",loop_variable,array[loop_variable]);
}
//BEGIN FREE ARRAY
free(array); array = NULL;
return 0;
}
Это должно скомпилироваться на любом компьютере с gcc или clang. Затем я запускаю эту программу на Valgrind, чтобы убедиться в отсутствии утечек памяти, и я получаю это:
==10791== HEAP SUMMARY:
==10791== in use at exit: 0 bytes in 0 blocks
==10791== total heap usage: 99 allocs, 99 frees, 20,988 bytes allocated
==10791==
==10791== All heap blocks were freed -- no leaks are possible
==10791==
==10791== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==10791== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Однако то, что меня беспокоит то, что я использую 20,988 байт для массива из 101 элементов. Использование памяти растет экспоненциально по мере увеличения массива, а не линейного на 4 байта/элемента.
Если я правильно понять выход VALGRIND в, этот массив должен иметь 4 * 101 = 404 элементов размером байт памяти, но кажется использовать примерно в 50 раз больше памяти, как это должно быть. Это небольшая проблема для такой небольшой программы, но более значимые программы на этом компьютере исчерпаются.
Мой вопрос: этот массив действительно использует 20,988 байт, или это Valgrind двойной подсчет памяти?
Есть ли более эффективный для памяти способ сделать это? Я не могу понять другие примеры realloc, хотя я старался следовать им настолько близко, насколько я могу, и сделать этот вопрос актуальным для максимально возможного числа пользователей.
не Valgrind отчетности суммарных размеров в '' malloc' и realloc' аргументов как 'общей кучи usage', игнорируя все' free's? – pts
Вы уверены, что растет экспоненциально, а не O (n^2)?20988 довольно близко к 4 * 101 * 101/2. – pts
всегда проверяют (! = NULL) возвращаемое значение из malloc и семейство функций, чтобы гарантировать успешную работу. – user3629249