【发布时间】:2014-09-24 03:34:22
【问题描述】:
我正在编写一个程序,我必须在其中管理一个字符串数组。在整个程序中,字符串被系统地删除/修改,直到只剩下一个字符串。
当不再需要字符串时,我会使用此函数将其删除:
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,就会出现内存泄漏。
我对指针的理解还很初级,所以请帮我调试一下,提高我的理解!
【问题讨论】:
-
我可以在您的代码中看到一些潜在的缺陷,但是如果没有看到您的代码的其余部分,特别是对
remove_element和free_fragments的调用,很难确定问题出在哪里。
标签: c pointers memory memory-management