[英]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()
的返回值,检查是否成功,然后,如果需要,将其分配回原始指针。
在您的代码中, c
是char
类型,可能不足以保存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.