gpt4 book ai didi

C数组char *在执行期间完全释放内存

转载 作者:太空宇宙 更新时间:2023-11-04 06:50:24 25 4
gpt4 key购买 nike

我想了解为什么这个脚本没有完全释放他的内存分配。Windows 内存使用图表从这些大约 400Mb 的总分配量中略有下降。所有的内存都是免费的 int 数组,但不是 char* 数组

如何做对?非常感谢您的帮助...

void testAlloc() {
unsigned char error = 0;
char **arr;
char **buf;
size_t size = 1;
size_t idx = 0;
size_t nextIdx;
size_t newSize;

arr = calloc(size, sizeof(char*));

while(idx < 9999999) {
nextIdx = idx+1;
newSize = nextIdx*2;
if(nextIdx > size) {
buf = realloc(arr, newSize * sizeof(char*));
if(buf != NULL) {
arr = buf;
size = newSize;
}else{
error = 1;
}
}
if(!error) {
arr[idx] = calloc(32, sizeof(char));
arr[idx] = "sample text";
}
idx++;
}

MessageBox(NULL, "stop before free", "", MB_OK);

size_t i = 0;
if(!error && arr != NULL) {
while(i < idx) {
free(arr[i]);
i++;
}
free(arr);
arr = NULL;
}
}
testAlloc();

最佳答案

这里:

        arr[idx] = calloc(32, sizeof(char));
arr[idx] = "sample text";

您正在分配 32 个字节的内存并将指向它们的指针存储在 arr[idx] 中,然后您将用指向由字符串文字表示的数组的指针覆盖该指针。动态分配被泄露。此外,稍后当您尝试释放数组元素指向的空间时,您会调用未定义的行为,因为当时存储在数组中的指针不是从任何分配函数获得的。

您可能想将字符串的内容复制到分配的空间中,而不是覆盖指向该空间的指针。为此,您需要 strcpy()

        arr[idx] = calloc(32, sizeof(char));
// Note: an error check really ought to be performed here
strcpy(arr[idx], "sample text");

关于C数组char *在执行期间完全释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52322451/

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