我有一個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,而不是有些手拿着初學者的語言:-) –