如何释放重新分配和分配的内存?

陶马豪斯

如何释放在开始时已重新分配并随后重新分配和重新分配的内存?这个ptr是我的尝试,但是valgrind说有6个分配和6个释放,但是3个块中有90个字节肯定丢失了。

char *textInFile = (char *) calloc(currentLength + 1, sizeof(char) * currentLength);
char *currentLine = (char *) calloc(currentLength + 1, sizeof(char) * currentLineLength);
...
while ((textInFile[index] = getc(f)) != EOF) {
    if (index > currentLength - 3) {
        currentLength += 10;
        ptr = textInFile;
        textInFile = (char *) realloc(textInFile, currentLength);
        textInFile = (char *) calloc(currentLength, sizeof(char) * currentLength);
        free(ptr);
    }
    ...
    if (textInFile[index] == '\n') {
        int k = 0;
        for (int i = previousIndex; i < index; i++) {
            if (k > currentLineLength - 3) {
                currentLineLength += 10;
                ptr = currentLine;  
                currentLine = (char *) realloc(currentLine, currentLineLength);
                currentLine = (char *) calloc(currentLineLength, sizeof(char) * currentLineLength);
                free(ptr);
            }
    ...
    index++;
}
...
free(textInFile);
free(currentLine);

== 4426 ==堆摘要:

== 4426 ==在出口处使用:3个块中的90个字节

== 4426 ==总堆使用量:9个分配,9个空闲,14,668个字节分配

== 4426 ==

== 4426 ==泄漏摘要:

== 4426 ==绝对丢失:3个块中的90个字节

== 4426 ==间接丢失:0个字节(0块)

== 4426 ==可能丢失:0字节,共0个块

== 4426 ==仍可到达:0字节,0块

== 4426 ==已抑制:0个字节,共0个块

杰里米·弗里斯纳

您需要调用free()所返回的每个非NULL指针calloc()如果调用realloc(),则不应调用free()作为参数传递的指针realloc(),而应调用返回free()的指针realloc()(注意:realloc()正确使用是棘手的,特别是如果您想正确处理错误时,除非绝对必要,否则我建议避免使用它)

特别是您的代码的一个问题是:

textInFile = (char *) realloc(textInFile, currentLength);
textInFile = (char *) calloc(currentLength, sizeof(char) * currentLength);

在第二行中,您textInFile使用所返回的指针覆盖了的指针calloc(),从而失去了对所返回的旧值的访问权限realloc(),因此您无法释放该缓冲区。因此,您有内存泄漏。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章