找不到内存问题
Can't find a memory issue
通过使用 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 语言编程的新手,因此问题可能很明显。但是我可以知道这个错误很长一段时间是从哪里来的,我将感谢能帮助我解决这个问题的人
'Free' 与 map
关联的内存,以及在您完成释放内存及其字段后的内存。
free(map);
不相关,但考虑将 map
设置为全局,因为它似乎是在代码中传递过多的单个实例。
我不确定,因为我不太了解 C,但我认为问题出在这一行:
board* map = (board*) malloc(sizeof(board));
我认为问题发生在 C 试图从该行的板上分配对象** 时,但我不知道为什么,它在我看来是正确的。
您尝试过逐步调试吗?
通过使用 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 语言编程的新手,因此问题可能很明显。但是我可以知道这个错误很长一段时间是从哪里来的,我将感谢能帮助我解决这个问题的人
'Free' 与 map
关联的内存,以及在您完成释放内存及其字段后的内存。
free(map);
不相关,但考虑将 map
设置为全局,因为它似乎是在代码中传递过多的单个实例。
我不确定,因为我不太了解 C,但我认为问题出在这一行:
board* map = (board*) malloc(sizeof(board));
我认为问题发生在 C 试图从该行的板上分配对象** 时,但我不知道为什么,它在我看来是正确的。
您尝试过逐步调试吗?