Не могу найти утечки памяти в c - PullRequest
1 голос
/ 17 августа 2011

Я запускаю createNewBoard, который вызывает createNewMatrix, и я выхожу из программы, и у меня возникает утечка памяти, которую я не могу найти. Вот код

BoardP createNewBoard(int width, int high)
{
    BoardP board = (BoardP) malloc(sizeof(Board));

    if (board == NULL)
    {
        reportError(MEM_OUT);
        return NULL;
    }
    board->height = high;
    board->width = width;
    board->matrix = createNewMatrix(width,high);
    printf("%c",board->matrix[1][1]);
    if (board->matrix == NULL)
    {
        reportError(MEM_OUT);
        freeBoard(board);
    return NULL;
    }
return board;
}

static char** createNewMatrix(int width, int height){
    char** newMatrix = (char**) calloc(height,sizeof(char*));
    int i;
    for (i=0; i<height; i++)
    {
        newMatrix[i] = (char*) calloc(width,sizeof(char)); //LINE 71
        if (newMatrix[i] == NULL)
        {
            int j;
            for (j=0; j<i; j++)
            {
                free(newMatrix[j]);
            }
            free(newMatrix);
            return NULL;
        }
    }
    return newMatrix;
 }

Это сводит меня с ума. Все, что я делаю, это создаю указатель на структуру Board (которая содержит целые числа и двумерный массив указателей), и у меня возникает утечка памяти. Вот сообщение:

==10436== HEAP SUMMARY:
==10436==     in use at exit: 100 bytes in 10 blocks
==10436==   total heap usage: 12 allocs, 2 frees, 196 bytes allocated
==10436== 
==10436== 100 bytes in 10 blocks are definitely lost in loss record 1 of 1
==10436==    at 0x4C2380C: calloc (vg_replace_malloc.c:467)
==10436==    by 0x4008C6: createNewMatrix (Board.c:71)
==10436==    by 0x40081E: createNewBoard (Board.c:55)
==10436==    by 0x4007C6: createNewDefaultBoard (Board.c:37)
==10436==    by 0x400F0C: main (PlayBoard.c:11)
==10436== 
==10436== LEAK SUMMARY:
==10436==    definitely lost: 100 bytes in 10 blocks
==10436==    indirectly lost: 0 bytes in 0 blocks
==10436==      possibly lost: 0 bytes in 0 blocks
==10436==    still reachable: 0 bytes in 0 blocks
==10436==         suppressed: 0 bytes in 0 blocks

Он указывает мне на строку 71, которая вызывает calloc для строки в матрице. При выходе из программы она вызывает freeBoard:

void freeBoard(BoardP board)
{
    if (board != NULL)
    {
        if(board->matrix != NULL)
        {
            free(board->matrix);
        }
        free(board);
    }
}

Есть идеи, почему у меня утечка памяти? Спасибо!

Ответы [ 5 ]

6 голосов
/ 17 августа 2011

Вы должны освободить отдельные линии, прежде чем освободить matrix.

for (i=0; i<height; i++)
{
    free(board->matrix[i]);
}
0 голосов
/ 17 августа 2011

board->matrix - указатель на указатель, который вы выделяете динамически. Сначала вы использовали calloc для выделения первого измерения и для каждого индекса вы использовали calloc для выделения другого измерения. Поэтому у вас есть массив указателей, которые указывают на блоки памяти, и вы должны освободить каждый блок, указанный каждым индексом.

В своем коде вы просто освобождаете первое измерение, каждое местоположение которого указывает на разные блоки. С другой стороны, эти блоки во 2-м измерении не освобождаются.

Вы должны сделать что-то вроде этого:

void freeBoard(BoardP board)
{
    int i;
    if (board != NULL)
    {
        if(board->matrix != NULL)
        {
            for (i=0; i<board->height; i++);
               free(board->matrix[i]);
        }
        free(board);
    }
}

Я попробовал вещь в этом посте

0 голосов
/ 17 августа 2011

Ваше бесплатное free(board->matrix) должно освободить матрицу так же, как вы освобождаете ее при проверке NULL на createNewMatrix.

void freeBoard(BoardP board)
{
    if (board != NULL)
    {
        if(board->matrix != NULL)
        {
            for (int i = 0; i < board->height; i++)
            {
                free(board->matrix[i]);
            }
            free(board->matrix);
        }
        free(board);
    }
}

Возможно, проще создать функцию freeMatrix, принимающую высотуили создайте матричную структуру, которая поддерживает свои собственные высоту и ширину.

0 голосов
/ 17 августа 2011

Я не вижу путаницы, вы явно не освобождаете ни один из height массивов размером width*sizeof(char). Судя по выходным данным, height и width равны 10.

0 голосов
/ 17 августа 2011

Для матрицы вы выделяете память для всех элементов, но не освобождаете их в функции freeBoard().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...