c - 调试无效的 free()

标签 c pointers memory memory-management

我正在编写一个程序,我必须在其中管理一个字符串数组。在整个程序中,字符串被系统地删除/修改,直到只剩下一个字符串。

我使用这个函数删除不再需要的字符串:

void remove_element(char **array, int index, int array_length)
{
    int i;
    for(i = index; i < array_length - 1; i++){
        array[i] = array[i + 1];
    }
    free(array[array_length]);
}

一旦我完全处理完数组,我就使用这个函数来确保所有字符串都是空闲的:

void free_fragments(char **frags){
    int i = 0;
    while((frags[i] != NULL) && sizeof(frags[i] != 0)){
        free(frags[i]);
        i++;
     }
    free(frags);
}

然而,当我这样做时,valgrind 给我一个“无效的 free()/delete/delete[]/realloc()”错误,特别是提示 free_fragments 中的“free(frags[i])”行。

我知道 free_fragments 似乎有点多余,只是因为理论上我可以在每个元素上调用 remove_element 直到剩下一个元素,然后再调用 remove_element ,但是当我尝试这样做时,我仍然得到一个 Invalid free()错误,但这次提示 remove_element。如果我在处理完数组后不调用 free_fragments,就会发生内存泄漏。

我对指针的理解很新手,所以请帮助我调试这个并提高我的理解!

最佳答案

问题是,当您执行 free(array[array_length]); 时,您没有将其置为 NULL,因此在 free_fragments 中您仍然认为它是一个有效的指针。 想一想,您似乎也释放了错误的条目……这应该可行:

void remove_element(char **array, int index, int array_length)
{
    int i;
    free(array[index]);
    for(i = index; i < array_length - 1; i++){
        array[i] = array[i + 1];
    }
    array[array_length-1] = NULL;
}

关于c - 调试无效的 free(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26008099/

相关文章:

更改结构内的调用

C 语言 - 来自不兼容指针类型的类型赋值 [默认启用]

c - 函数地址一致?

javascript - PHP 是单独存储 session 还是共享内存?

c - 检查 1 到 100 之间的数字时出现问题

c - LinkedList 添加节点按大小与 C 比较

C中常量指针的困惑

arrays - Swift 分配指针数组

delphi - 如何解决内存分段并强制FastMM释放内存给OS?

c - 如何在avro-c中使用数组作为map的值