我有一个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'd什么值指向)。如果我摆脱了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块中获得10bytes的泄漏内存。任何线索,我可以在哪里找到这个?
你可能想释放2串用'第一代> val'和'一线>下一步 - > val'而不是'tempstring'指出。 –
事实上,并没有免费的'tempstring'!你仍然在使用引用的内存。 – ikegami
...当你释放它时,它绝对不会使任何指向NULL的指针 - 你必须自己去做。这是C,而不是有些手拿着初学者的语言:-) –