Realloc使用太多内存

con*_*con 3 c memory arrays valgrind 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;
}
Run Code Online (Sandbox Code Playgroud)

这应该在任何带有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)
Run Code Online (Sandbox Code Playgroud)

然而,让我感到困扰的是,我使用了20,988字节的101元素阵列.随着数组变大,内存使用量呈指数增长,而不是线性增长4个字节/元素.

如果我正确理解Valgrind的输出,这个数组应该有4*101个元素= 404字节的内存大小,但似乎使用了大约50倍的内存.对于这样一个小程序来说,这是一个微不足道的问题,但更有意义的程序将耗尽这台计算机上的内存.

我的问题:这个数组真的使用了20,988字节,还是Valgrind重复计算内存?

是否有更节省内存的方法来做到这一点?我无法理解realloc的其他示例,尽管我尽可能地密切关注它们,并使这个问题与尽可能多的用户相关.

Pas*_*uoq 5

==10791==     in use at exit: 0 bytes in 0 blocks
==10791==   total heap usage: 99 allocs, 99 frees, 20,988 bytes allocated
Run Code Online (Sandbox Code Playgroud)

这个数组真的使用了20,988字节

不,它使用0字节.

"已分配"显然意味着"已分配",包括已释放的字节,因为"仍然分配"的内存量为零(另一行告诉您).