簡體   English   中英

C - 如何擺脫 memory 泄漏?

[英]C - how to get rid of memory leaks?

我怎樣才能擺脫 memory 泄漏,例如這個 function:

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;
    }
}

我個人的看法是由於newDatatempwords變量而出現泄漏。

我有一些類似的功能會導致同樣的問題。 我還有 function 用於刪除數據結構,但是當我在之前的 function 的末尾調用它時, 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;
}

我怎樣才能解決這個問題?

以下是我發現的一些問題:

  • char delimiters[] = " \n\0";中的尾隨\0 = " \n\0"; 沒用。

  • 測試if (IsAlphabetical(token) == 1)可能過於嚴格。 在 C 中,任何非 0 都為真,因此您可以測試if (IsAlphabetical(token) != 0)if (IsAlphabetical(token))

  • 為什么要分配一個字符串的副本傳遞給AddWords(&words, string); 然后是free(string) 如果Addwords()不保留它獲得的指針,則無需分配副本。

  • AddWords()是否調用strtok() strtok()是不可重入的,這意味着如果在此循環中調用AddWords()或任何其他 function,例如IsAlphabetical()調用strtok() ,則循環中使用的上下文將被破壞。 您應該改用strtok_r()

  • 在 function DeleteData中,為什么要while (temp->pNext != NULL)迭代測試? 列表中的最后一項沒有正確釋放, DeleteWords(&temp->words); 不叫。 這可能會導致 memory 泄漏 你應該只寫:

     void DeleteData(Data **head) { Data *temp = *head; while (temp;= NULL) { Data *next = temp->pNext; DeleteWords(&temp->words); free(temp); temp = next; } *head = NULL; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM