C 函数getline的内存泄漏。(仍然可以到达)

C 函数getline的内存泄漏。(仍然可以到达),c,memory,memory-management,memory-leaks,valgrind,C,Memory,Memory Management,Memory Leaks,Valgrind,下面是我的一段代码(目的是读取行并将其构造成一个结构): 稍后在我的主函数中,我释放了getline函数分配的buffer: void ReadFile(){ line l = ReadLine(); printLine(l); free(l.letters); } 但是我知道有一些内存(使用valgrind):函数getline所在的malloc仍然可以访问泄漏。应该使用malloc()分配getline()的内存,尝试用line(char*buffer=(char*)malloc(coun

下面是我的一段代码(目的是读取行并将其构造成一个结构):

稍后在我的主函数中,我释放了getline函数分配的buffer:

void ReadFile(){
line l = ReadLine();
printLine(l);
free(l.letters);
}
但是我知道有一些内存(使用valgrind):函数getline所在的malloc仍然可以访问泄漏。

应该使用malloc()分配getline()的内存,尝试用line(char*buffer=(char*)malloc(count*sizeof(char))更改line(char*buffer=NULL)(char*buffer=(char*);
)其中count是输入字符串的最大长度。

好的,所以过了一段时间,我发现如果getline()无法分配内存,它仍然会分配缓冲区,因此如果nRead=-1(表示getline中有错误),我们必须释放缓冲区。否则我就回来

(行){.length=0.letters=NULL}


我丢失了一个指向缓冲区的指针,尽管分配了一个错误。

如何“获取”一些未释放的内存?有工具告诉你吗?上面说什么?显示该工具的精确输出。或者你是从你的程序行为中推断出来的。什么行为?编辑问题以提供答案。我使用了valgrind(编辑的初始帖子),并且在函数getline()所在的同一行中仍然可以访问Leak_。我已经用valgrind测试了您的代码:“所有堆块都被释放了——不可能有泄漏”。你能给你的
printLine
函数吗?它不以任何方式修改缓冲区,只是用printf函数打印它。虽然我使用的是Clion valgring,但这可能是个问题?那么我猜这是本地libc
getline
implementation(请参阅)的问题。如果没有足够的空间分配,getline()调用realloc本身,这可能会导致您提到的问题。“如果*lineptr为NULL,那么getline()将分配一个缓冲区来存储该行,该行应由用户程序释放。(在这种情况下,*n中的值被忽略。)“(man getline)在
realloc
的情况下,前面分配的空间由
realloc
释放:“如果内存对象的新大小需要移动对象,则会释放对象先前实例化的空间”没有指定最大输入长度。
static line ReadLine(){
    char *buffor = NULL;
    size_t length = 0;
    int nRead = 0;
    nRead = getline(&buffor, &length, stdin);
    return nRead == -1 ? (line) {.length = 0, .letters = NULL} : (line) {.length = nRead, .letters = buffor};
}
void ReadFile(){
line l = ReadLine();
printLine(l);
free(l.letters);
}