【发布时间】:2020-09-18 18:51:25
【问题描述】:
我怎样才能摆脱例如这个函数的内存泄漏:
void AddData(Data **head, char *sentence, int number) {
Words *words = NULL;
char delimiters[] = " \n\0";
char *token = strtok(sentence, delimiters);
while (token != NULL) {
if (IsAlphabetical(token) == 1) {
char *string = (char *)malloc((strlen(token) + 1) * sizeof(char));
strcpy(string, token);
AddWords(&words, string);
free(string);
}
token = strtok(NULL, delimiters);
}
Data *temp = *head;
Data *newData = (Data *)malloc(sizeof(Data));
newData->lineNumber = number;
newData->words = words;
newData->pNext = NULL;
if (*head == NULL)
*head = newData;
else {
while (temp->pNext != NULL)
temp = temp->pNext;
temp->pNext = newData;
}
}
我个人的看法是由于newData、temp 和words 变量而出现泄漏。
我有一些类似的功能会导致同样的问题。
我也有删除数据结构的功能,但是当我在前一个函数的末尾以这种方式调用它时,DeleteData(&temp) 程序将不会执行。我想是因为我的整个列表都被删除了。
void DeleteData(Data **head) {
Data *temp = *head;
while (temp->pNext != NULL) {
Data *next = temp->pNext;
DeleteWords(&temp->words);
free(temp);
temp = next;
}
free(temp); /* to check that */
*head = NULL;
}
我该如何解决这个问题?
【问题讨论】:
-
不存在的例程
AddWords()是否分配了任何东西,如果是,这些分配器是否被释放?最初分配给newData的分配器是否被释放? -
编辑问题以提供minimal reproducible example,包括输入数据、观察到的程序行为、所需行为以及您掌握的存在泄漏的证据。
-
你没有为
temp分配任何东西,所以不会有任何泄漏。你是否通过 valgrind 或其他类似的工具运行代码来告诉你是否存在泄漏?但是由于这只是部分代码,所以不可能全部都说出来 -
发布我的所有代码是个好主意吗?大约600行
-
我使用 drmemeory 运行
标签: c memory-leaks dynamic-memory-allocation free singly-linked-list