我有一个函数,该函数返回可以循环使用的动态分配数组的列表。呼叫者正在释放列表,但仍从valgrind收到泄漏警告。
我正在使用此版本,因此调用方不需要知道数组的长度,并且可以简单地循环直到NULL。
char **getList() {
char **list = (char *[]){"John Doe", "Jane Doe", NULL};
char **values = malloc(sizeof(char*) * 1);
int i = 0;
while(*list) {
values[i] = malloc(sizeof(char) * (strlen(*list) + 1));
strcpy(interests[i++], *list);
list++;
}
values[i] = NULL;
return values;
}
呼叫者级别
int main() {
char **values = getList();
while(*values) {
// do something with the *value
values++;
}
free(values); // free up the values
return 0;
}
答案 0 :(得分:0)
values
递增,因此之后的free(values);
无效。values
元素指向的字符串不会被释放。尝试一下:
int main() {
char **value_list = getList(), **values;
values = value_list;
while(*values) {
// do something with the *value
values++;
}
// free up the values
for (values = value_list; *values; values++) {
free(*values);
}
free(value_list);
return 0;
}
还请注意
char **values = malloc(sizeof(char*) * 1);
函数getList()
中的应该是
char **values = malloc(sizeof(char*) * 3);
以避免越界写入。