簡體   English   中英

為什么我的程序有內存泄漏?

[英]Why Does my program have Memory Leaks?

我正在嘗試創建一個小的c程序 ,它將讀取任意大小的字符串,而不會有任何內存泄漏。

根據我的研究,函數malloc可用於為我們想要存儲的任何數據分配多個字節。

在我的計划,我通過為0個字符分配空間開始,我使指針指向它。 然后,每當我讀到一個字符,我做一個指針oldWord指向的話 ,一旦我分配了新的角色更大的內存位置,其釋放舊的內存位置。

我的研究表明, free函數可用於釋放不再需要的舊內存位置。 但是,我不確定我哪里出錯了。 您可以在下面看到我的代碼。

#include <stdio.h>
#include <stdlib.h>

int main(void){
    char *word = malloc(0);

    printf("Enter name: ");
    readWord(word);
    printf("Your name is: %s\n", word);

    free(word);

    word = realloc(0);

    printf("Enter name: ");
    readWord(word);
    printf("Your name is: %s\n", word);

    free(word);

    return 0;
}

void readWord(char *word){
    int i = 0;
    char *oldWord, c = getchar();

    while(c != ' ' && c != '\n'){
        oldWord = word;
        word = realloc(word, i + 1);
        free(oldWord);
        word[i++] = c;
        c = getchar();
    }

    oldWord = word;
    word = realloc(word, i + 1);
    free(oldWord);
    word[i] = '\0';
}

我在這里看到的問題是

   free(oldWord);

沒有檢查realloc()失敗 如果realloc()成功,將相同的指針傳遞給free()會導致未定義的行為

那說,還有一些說明

  • 像這樣的語法

     word = realloc(word, i + 1); 

    是危險的,如果realloc()失敗,你也會失去實際的指針。 您應該使用臨時指針來保存realloc()的返回值,檢查是否成功,然后,如果需要,將其分配回原始指針。

  • 在您的代碼中, cchar類型,可能不足以保存getchar()返回的所有可能值,例如EOF。 您應該使用int類型,即getchar()返回的類型。

您的代碼中存在多個問題:

  • free傳遞給realloc()的指針。 這是不正確的,因為如果移動塊, realloc()將釋放內存。 否則指針被釋放兩次。

  • 指針重新分配bu readWord()永遠不會傳遞給調用者。

  • 分配0大小的塊具有未指定的行為:它可能返回NULL或有效指針,該指針不應被解除引用但可以傳遞給free()realloc()

  • 您不測試文件結尾:如果文件中沒有空格或換行符,則存在無限循環,例如,如果文件為空。

  • 你在調用之前沒有readWord()的原型。

這是一個改進而簡單的版本:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

char *readWord(void);

int main(void) {
    char *word;

    printf("Enter name: ");
    word = readWord();
    if (word == NULL) {
        printf("Unexpected end of file\n");
    else
        printf("Your name is: %s\n", word);

    free(word);
    return 0;
}

char *readWord(void) {
    int c;
    size_t i = 0;
    char *word = NULL;

    while ((c = getchar()) != EOF && !isspace(c)) {
        word = realloc(word, i + 2);
        if (word == NULL)
            break;
        word[i++] = c;
        word[i] = '\0';
    }
    return word;
}

暫無
暫無

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

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