我正在编写一个程序,我必须在其中管理一个字符串数组。在整个程序中,字符串被系统地删除/修改,直到只剩下一个字符串。
我使用这个函数删除不再需要的字符串:
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/