重写2d阵列时内存泄漏

时间:2016-12-02 07:08:23

标签: c pointers memory-leaks malloc dynamic-memory-allocation

我想调用一个使用我的2d动态数组的函数来创建另一个2d动态数组,然后重写我的第一个数组的值。所以代码是这样的:

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

int **bigger(int **A)
{
    int i;
    int **A2 = (int **)malloc(10 * sizeof(int *));

    for(i = 0; i < 10; i++)
        A2[i] = (int *)malloc(10 * sizeof(int));

    return A2; 
    }

int main(void)
{
    int i;
    int **A = (int **)malloc(5 * sizeof(int *));

    for(i = 0; i < 5; i++)
        A[i] = (int *)malloc(5 * sizeof(int));

    A = bigger(A);

    for(i = 0; i < 10; i++)
        free(A[i]);

    free(A);

    return 0;
}

如果我用valgrind --leak-check=yes检查它,我得到总堆使用量:6个allocs,3个frees,240个字节分配。我该如何解决这个内存泄漏?

1 个答案:

答案 0 :(得分:4)

TL:DR ,您不是重写,而是覆盖

问题在于

 A = bigger(A);

bigger()函数内部,你正在分配新的内存,然后将它们存回A,这会让你失去指向以前分配的内存的指针,从而使它们无法访问< / em>并且不是free() - d。那些导致泄漏。

您需要使用realloc()来调整已malloc()内存区域的大小。

否则,在再次致电malloc()之前,在bigger()内,您应该free()可用的回忆。