gpt4 book ai didi

c - 重新分配使用太多内存

转载 作者:太空狗 更新时间:2023-10-29 16:11:51 25 4
gpt4 key购买 nike

我已经做了一个最小工作示例,说明如何使用 realloc 将元素添加到数组。这将在包含更多元素的 future 计划中得到扩展。

#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)

然而,令我烦恼的是我为 101 个元素的数组使用了 20,988 字节。随着数组变大,内存使用呈指数增长,而不是按 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

is this array really using 20,988 bytes

不,它使用了 0 个字节。

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

关于c - 重新分配使用太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29608760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com