由于strsep
是一个破坏性操作,我想保留line
数组的内容,所以我复制了line
并将其赋给变量newline
。然后,我对newline
执行破坏性操作。然后,我尝试释放newline
,但遇到内存泄漏。我不是100%确定。但是内存泄漏很可能是由于newline
没有完全释放。以前,当我对line
执行破坏性的strsep
操作时,我没有得到内存泄漏。我正在用fsanitize=address
编译我的C代码以发现内存泄漏。
struct Item {
char* line;
struct Item *next;
};
struct Item* getArguments(char *line) {
struct Item *current = NULL;
struct Item *next = NULL;
struct Item *first = NULL;
char *found = NULL;
char *newline = strdup(line);
char blank[] = "";
while ((found = strsep(&newline," \n")) != NULL) {
if (strcmp(found, blank) != 0) {
next = malloc(sizeof(struct Item));
next->next = NULL;
next->line = malloc((strlen(found)+1) * sizeof(char));
strcpy(next->line, found);
if (current) {
current->next = next;
}
current = next;
if (first == NULL) {
first = current;
}
}
}
free(found);
free(newline);
newline = NULL;
return first;
}
1条答案
按热度按时间jum4pzuy1#
1.将参数更改为
const char *line
,因为您未明确修改它。1.保留
strdup(line)
返回的地址的副本,以便在strsep()
修改该指针时与free()
一起使用。将其设置为常量指针,以真正明确地表示它。1.不要
free(found)
。1.最小化变量范围。
1.条件中的赋值语句有点难读,所以我改变了循环早期返回循环的构造。
if(!*found)
与char blank[] = "": strcmp(found, blank)
相同,用于检查空字符串。1.检查
malloc()
和strdup()
的返回值,并在失败时处理清除。这个更改增加了许多嘈杂的错误处理。if(current)
和if(first == NULL
实际上只是第一次迭代的一个特例,因此将它们折叠为if
-else
。1.(未修复)可以将
malloc()
替换为calloc()
,以消除行next->next = NULL
。1.(未修复)请考虑调整接口以允许调用方区分内存分配错误和未找到字符串。
瓦尔格林看起来很高兴