c - 释放所有由 malloc(), realloc() 在 C 中分配的内存

标签 c memory memory-management memory-leaks valgrind

我正在尝试通过 malloc()、realloc() 释放()所有分配的内存,但 valgrind 说这是内存泄漏。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(int argc, char *argv[]) {

    int lines_allocated = 128;
    int max_line_len = 50;

    FILE *fp;

    /* File allocate lines of text */
    char **array = (char **)malloc(sizeof(char*)*lines_allocated);
    if (array==NULL) {
        fprintf(stderr,"Out of memory (1).\n");
        exit(1);
    }

    FILE *file = fopen("file.txt", "r");
    if (file == NULL) {
        fprintf(stderr,"Error opening file.\n");
        exit(2);
    }

    int il;
    for (il = 0; 1; il++) {
        int j;

        /* Have we gone over our line allocation? */
        if (il >= lines_allocated) {
            int new_size;

            /* Double our allocation and re-allocate */
            new_size = lines_allocated*2;
            array = (char **)realloc(array,sizeof(char*)*new_size);

            if (array==NULL) {
                fprintf(stderr,"Out of memory.\n");
                exit(3);
            }

            lines_allocated = new_size;
        }

        /* Allocate space for the next line */
        array[il] = malloc(max_line_len);
        if (array[il]==NULL) {
                fprintf(stderr,"Out of memory (3).\n");
                exit(4);
            }
        if (fgets(array[il], max_line_len-1, file)==NULL)
            break;

        /* Get rid of CR or LF at end of line */
        for (j=strlen(array[il])-1;j>=0 && (array[il][j]=='\n' || array[il][j]=='\r');j--)
            ;

        array[il][j+1]='\0';
    }

    /* Close file */
    fclose(file);

    /* Print and free the every element of the array */
    int cc;
    for (cc = 0; cc < il; cc++) {
        printf("%s\n", array[cc]);
        
        /* Free the every element of the array */
        free(array[cc]);
    }

    /* Free hole array */
    free(array);

    return 0;
}

valgrind ./main

valgrind --leak-check=full --show-reachable=yes ./main
==4806== Memcheck, a memory error detector
==4806== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==4806== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==4806== Command: ./main
==4806== 
1
2
3
4
5
6
7
8
9
10
11
==4806== 
==4806== HEAP SUMMARY:
==4806==     in use at exit: 50 bytes in 1 blocks
==4806==   total heap usage: 14 allocs, 13 frees, 2,192 bytes allocated
==4806== 
==4806== 50 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4806==    at 0x4C2AC3D: malloc (vg_replace_malloc.c:299)
==4806==    by 0x40092E: main (in /var/www/mem/main)
==4806== 
==4806== LEAK SUMMARY:
==4806==    definitely lost: 50 bytes in 1 blocks
==4806==    indirectly lost: 0 bytes in 0 blocks
==4806==      possibly lost: 0 bytes in 0 blocks
==4806==    still reachable: 0 bytes in 0 blocks
==4806==         suppressed: 0 bytes in 0 blocks
==4806== 
==4806== For counts of detected and suppressed errors, rerun with: -v
==4806== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

如何正确释放内存?它说应该再释放一个内存块,但它在哪里?

最佳答案

for (cc = 0; cc < il; cc++) {

如果 ilarray 的有效索引(确实如此),则循环中的比较应该是:

for (cc = 0; cc <= il; cc++) {

为了触发 array 的最后一个元素(并释放它的内存)。

关于c - 释放所有由 malloc(), realloc() 在 C 中分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38356997/

相关文章:

c++ - 如果我在 C++ 中使用 operator new[] 分配一个对象数组,但单独解除分配它们是否仍然构成内存泄漏?

c++ - 函数内部的内存分配和删除

c - 理解章节标题 ELF

c - 异常行为字符串 MPI_Send() 和 MPI_Recv()

c - 您需要使用 extern 来处理不完整的类型吗?

c - 子进程的内存优化

c - 是否有一种节省空间的方法来存储和检索数据集的顺序?

java - android中的MemoryFile有什么用

java - 解决向double Arraylist添加新值时Java堆空间错误

ios - 发送到已释放实例的消息 - 视为属性