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的其他示例,尽管我尽可能地密切关注它们,并使这个问题与尽可能多的用户相关.
==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字节.
"已分配"显然意味着"已分配",包括已释放的字节,因为"仍然分配"的内存量为零(另一行告诉您).
| 归档时间: |
|
| 查看次数: |
353 次 |
| 最近记录: |