【问题标题】:Can't find a memory issue找不到内存问题
【发布时间】:2021-04-01 11:33:02
【问题描述】:

通过使用 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", &height, &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(&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 编程新手,因此问题可能很明显。但是我可以很长时间以来这个错误来自哪里,我会感谢那个可以帮助我的人

【问题讨论】:

  • 你 malloc() 一些内存,但你从来没有 free() 它。
  • 我有,编辑正文
  • -g编译得到调试信息,它会显示一个行号。
  • You free()'d map->field 但不是地图本身。

标签: c memory memory-leaks malloc


【解决方案1】:

我不确定,因为我对C不太了解,但我认为问题出在这一行:

board* map = (board*) malloc(sizeof(board));

我认为问题发生在 C 试图从那条线上的板上分配对象** 时,但我不知道为什么,在纸上对我来说似乎是正确的。

你试过一步步调试吗?

【讨论】:

    【解决方案2】:

    “释放”与map 关联的内存,以及在您完成释放内存及其字段之后。

    free(map);
    

    不相关,但考虑将map 设为全局,因为它似乎是在代码中过多传递的单个实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 2014-05-19
      • 1970-01-01
      • 2017-10-26
      相关资源
      最近更新 更多