Не удается найти проблему с памятью

#c #memory #memory-leaks #malloc

#c #память #утечки памяти #malloc

Вопрос:

При тестировании моего кода с использованием valgrind я получил сообщение:

 *==18867== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==18867==    at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==18867==    by 0x109609: readBoard (in /home/tima/Downloads/bd)
==18867==    by 0x109A06: main (in /home/tima/Downloads/bd)
==18867==* 
 

Я не могу понять, что может вызвать эту ошибку, ниже вы можете найти части кода, которые упоминаются в этом сообщении:

 // Struktura reprezentująca planszę
typedef struct board {
    int height; // wysokość planszy
    int width; // szerokość plansy
    int diamonds; // liczba diamentów na planszy
    point rf; // pozycja Rockfordu w tablicy field
    object** field; // mapa objektów planszy
    bool reachedExit; // true wtw, gdy Rockford opuścił planszę
} board;

// Oczyszczenie pamięci alokowanej dla planszy
void clearBoard(board* map) {
    for (int i = 0; i < map->height; i  )
        free(map->field[i]);
    free(map->field);
}
// Inicjalizacja planszy
void initializeBoard(board* map, int height, int width) {
    map->height = height;
    map->width = width;
    if (map) {
        map->field = (object **) malloc(sizeof(object *) * (size_t) height);
        for (int i = 0; i < height; i  )
            map->field[i] = (object *) malloc(sizeof(object) * (size_t) width);
    }
    map->diamonds = 0;
    map->reachedExit = false;
}
// Wczytanie planszy i zwracanie wskaźnika na nią
board* readBoard() {
    int height, width;
    scanf("%d %d", amp;height, amp;width);
    skipNewline(); // wczytujemy w pustośc symbol 'n'

    board* map = (board*) malloc(sizeof(board));
    initializeBoard(map, height, width);

    point pos;
    for (pos.y = 0; pos.y < height; pos.y  ) {
        for (pos.x = 0; pos.x < width; pos.x  ) {
            object input = (char) getchar();
            if (input == ROCKFORD) { // jeżeli wczytanym objektem jest rockford
                input = EMPTY; // to zamieniamy ten objekt na pustość
                map->rf = pos; // i zapisujemy pozycję Rockfordu
            }
            set(map, pos, input);
            map->diamonds  = (input == DIAMOND);

            if (pos.x == width - 1) // jeżeli wczytany symbol jest ostatnim objektem wierszu planszy
                skipNewline(); // to wczytujemy w pustość symbol 'n'
        }
    }
    return map;
}


int main(void) {
    board* map = readBoard(); // Plansza, wczytana z wejścia
    move command = NOTHING; // Ruch do przemieszczenia Rockfordu

    // Dopóki nie wczytaliśmy koniec pliku
    while (isValid(command)) {
        stabilizeBoard(map); // stabilizujemy planszę przed ruchiem
        showBoard(map); // pokazujemy planszę
        while (readMove(amp;command)) { // wczytanie po jednemu ruchu dopóki nie spotkamy EOF lub 'n'
            if (!map->reachedExit) { // jeżeli Rockford nie opuścił planszę
                operateMove(map, command); // przemieszczenie Rockfordu według command
                stabilizeBoard(map); // stabilizujemy planszę po ruchu
            }
        }
    }

    clearBoard(map); // oczyszczenie pamięci
    return 0;
}
 

Я новичок в программировании на C, поэтому проблема может быть очевидной. Однако я мог бы, откуда могла возникнуть эта ошибка в течение длительного времени, и я буду благодарен тому, кто может мне помочь с этим

Комментарии:

1. Вы malloc() некоторую память, но вы никогда не освобождаете () ее.

2. Он у меня есть, отредактированный основной текст

3. Скомпилируйте с -g помощью, чтобы иметь отладочную информацию, в ней будет показан номер строки.

4. Вы освобождаете ()’d map-> поле, но не саму карту.

Ответ №1:

«Освободите» память, связанную с map as, после того, как вы закончите освобождать память с ее полями.

 free(map);
 

Не связанный, но рассматривайте возможность создания map как глобальный, поскольку кажется, что это один экземпляр, который слишком часто передается по коду.

Ответ №2:

Я не уверен, потому что я мало знаю о C, но я думаю, что проблема в этой строке:

плата * карта = (плата *) malloc(sizeof(плата));

Я думаю, что проблема возникает, когда C пытается выделить object ** из board в этой строке, но я не знаю почему, мне это кажется правильным на бумаге.

Вы пробовали отлаживать шаг за шагом?