c - 无法理解 Valgrind 的错误消息

标签 c valgrind chess

我正在用 C 语言开发一个国际象棋引擎。运行 Valgrind 时我发现内存泄漏:

==18455== 64 bytes in 1 blocks are definitely lost in loss record 9 of 199
==18455==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==18455==    by 0x40451C: copyGame (Chess.c:1093)
==18455==    by 0x401356: addToList (Chess.c:213)
==18455==    by 0x4014A0: register_move (Chess.c:245)
==18455==    by 0x4019C3: getPawnMoves (Chess.c:300)
==18455==    by 0x40119A: getSquareMoves (Chess.c:169)
==18455==    by 0x404F88: evaluate (MiniMax.c:69)
==18455==    by 0x405D93: alphaBetaMax (MiniMax.c:290)
==18455==    by 0x405CF6: alphaBetaMax (MiniMax.c:274)
==18455==    by 0x405CF6: alphaBetaMax (MiniMax.c:274)
==18455==    by 0x405EC1: getBestMove (MiniMax.c:307)
==18455==    by 0x403933: computerTurn (Chess.c:852)

这里发生的事情是这样的:在计算机转动期间,极小极大算法达到深度 0 后,它调用评估。评估查看当前玩家的所有可能的 Action 并将它们添加到列表中。为了检查是否可以将移动添加到该列表中,该移动会在当前游戏的副本上执行,并且程序会检查当前玩家是否不受控制(合法移动)。然后就可以添加移动了。

由此我了解到 copyGame 似乎存在问题:

void copyGame(game_t game, game_t *copy)
{
int i = 0, j = 0;
copy->data = (int*)malloc(sizeof(int)* 16);
checkMalloc(copy->data);
copy->board = (board_t)malloc(sizeof(char*)*BOARD_SIZE); // board_t is char**
checkMalloc(copy->board);
for (i = 0; i<BOARD_SIZE; i++)
{
    copy->board[i] = (char*)malloc(sizeof(char)*BOARD_SIZE);
    checkMalloc(copy->board[i]);
}
for (i = 0; i<16; i++)
{
    copy->data[i] = game.data[i]; //data contains additional information about the game
}
for (i = 0; i<BOARD_SIZE; i++)
    for (j = 0; j<BOARD_SIZE; j++)
    {
        copy->board[i][j] = game.board[i][j];
    }
} 

这是调用 copyGame 的函数:

move_t* addToList(game_t game, move_t* list, move_t * move, int color)
{
int kx, ky;
game_t copy;
copyGame(game, &copy);
makeMove(&copy, *move);

kx = copy.data[2];
ky = copy.data[3];
if (color)
{
    kx = copy.data[0];
    ky = copy.data[1];
}
if (isAttacked(&copy, kx, ky, color) == 0) // if curplayer's king isn't attacked
{
    move->next = list;
    list = move;
}
else
{
    free(move);
}
freeGame(copy);
return list;
}

但我怀疑问题可能出在 freeGame 上:

void freeGame(game_t game)
{
int i = 0;
for (i = 0; i<BOARD_SIZE; i++)
{
    free(game.board[i]);
}
free(game.data);
}

我只是不明白 Valgrind 提出的错误,如果有更多 C 经验的人可以提供帮助,我将不胜感激。感谢您的阅读。

最佳答案

您正在释放 game.data 以及每个 game.board[i]。但您并没有释放 game.board 本身(copyGame 中的第二个 malloc)。将其添加到 freeGame 的末尾:

free(game.board);

关于c - 无法理解 Valgrind 的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26098835/

相关文章:

java - 在 jbutton 中排序图像和文本

c - 读取 bmp header C++ 时出错(颜色数 = 0)

c - 作者插入不需要的换行符

memory-leaks - Valgrind 可以显示泄漏内存的值吗?

c - 为什么这里有无效写入(Valgrind)

C++ - 对结构使用 GTest 值参数化测试会导致 valgrind 错误

ios - Stockfish Chess Engine 与 Swift 中的 iOS 项目集成

c# - 删除最少数量的国际象棋骑士,这样剩下的骑士就不会威胁到另一个骑士

c - 如何测试我的驱动程序是否已加载,然后从 Linux 内核访问我的驱动程序功能?

c - 这段用 mmap 读取的代码有什么问题?