【发布时间】:2017-09-07 08:14:53
【问题描述】:
我有一个 squeue(堆栈和队列的组合)。我有一个名为 mergeFront 的函数,它的工作应该是将前两个节点合并为一个。例如,如果前面的节点是“alpha”,而第二个节点是“beta”,则它们应该合并到“alphabeta”中。
void mergeFront(struct Squeue* squeue){
struct Node* temp;
char *string;
char *tempstring=malloc(sizeof(char)*100);
temp = squeue->first;
temp = temp->next;
string = squeue->first->val;
strcpy(tempstring, string);
string = temp->val;
strcat(tempstring, string);
squeue->first->next->val=tempstring;
temp = squeue->first;
squeue->first = temp->next;
free(temp);
free(tempstring);
}
当我在最后一行free(tempstring) 时,第一个节点现在变为空(假设因为我已经释放了值所指向的内容)。如果我摆脱了free(tempstring),它运行良好,但存在内存泄漏。如何在正确释放内存的同时做到这一点?
节点结构如下
struct Node{
char* val;
struct Node* next;
struct Node* prev;
};
获取@ikegami 给出的代码后,我的代码如下:
void mergeFront(struct Squeue* squeue){
struct Node* node1 = squeue->first; if (node1 == NULL) return;
struct Node* node2 = node1->next; if (node2 == NULL) return;
char* str1 = node1->val; size_t str1len = strlen(str1);
char* str2 = node2->val; size_t str2len = strlen(str2);
char* merged = malloc(str1len + str2len + 1);
memcpy(merged, str1,str1len + 1);
strcpy(merged+str1len, str2);
node1->val = NULL;
free(node1->val);
node1->val = merged;
node1->next = node2->next;
node2->val = NULL;
free(node2->val);
free(node2);
}
除了我仍然在 1 个块中获得 10 字节的泄漏内存外,它功能齐全。关于我在哪里可以找到这个的任何线索?
【问题讨论】:
-
你可能想释放
first->val和first->next->val而不是tempstring指向的2个字符串。 -
确实,不要免费
tempstring!您仍在使用引用的内存。 -
...当你释放它时,它绝对不会将任何指向它的指针设为 NULL——你必须自己做。这是 C,而不是一些手把手的初学者语言 :-)
-
重新编辑:您不能将指针设置为
NULL之前你free它!如果您觉得必须设置为NULL,请在free之后进行。 -
node1->val = NULL; free(node1->val);没有意义。和node1->val = NULL;一样