繁体   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