【发布时间】:2017-09-02 11:48:40
【问题描述】:
我正在尝试从文件中读取一行并返回该行。但是,我不断收到内存泄漏,丢失了 4000 个字节,并且比 allocs 少了一个。我不知道为什么会这样。下面是函数。
char *readLine(FILE *input, int lineNum) {
char *string = calloc(MAX_LEN, sizeof(char));
rewind(input);
char *check = fgets(string, MAX_LEN, input);
int stringLength = strlen(string);
if (stringLength > MAX_LEN) {
printf("Line too long to stdout.");
free(string);
return EXIT_SUCCESS;
} else
if (check == NULL) {
free(string);
return NULL;
}
return string;
}
我这样称呼它:
char *line = readLine(input, 0);
注意:忽略lineNum的东西,解决内存泄漏后我会添加。
那么,内存泄漏的原因和位置是什么?彻底的解释将非常有帮助。谢谢大家!
编辑:这是调用readLine()的函数:
char *makeSummary(FILE *input, int summaryNum) {
char *line = readLine(input, 0); //Get first line
int lineLength = strlen(line);
if (summaryNum == 1) {
//Get the last line of file by looping till NULL
lineNum = 10;
line = readLine(input, lineNum);
//Do more stuff with line
}
free(line);
}
【问题讨论】:
-
使用后必须 free() `line'。但总的来说,在 C 中必须为此功能“设计”约定并严格使用。 C++ 有更多的可能性
-
返回EXIT_SUCCESS;打破了你自己的约定
-
1)
if(stringLength > MAX_LEN) {永远不会是真的 2)if(check < 0) {你在这里比较一个指向 -1 的指针。 -
1) 好的,这给了我另一个需要解决的问题 2) 哎呀,这意味着 if(check == NULL)。谢谢。
-
你的泄漏是显而易见的。你读了一行,如果
summaryNum == 1为真,你改变行号并读另一行,盲目地覆盖刚刚读的前一行,因此泄漏它。在伤口上加盐,你永远不会检查初始readLine调用的结果,因此随后的strlen可以通过在 null 上执行轻松调用未定义的行为指针。
标签: c file memory-leaks fgets