所以我正在编写一个程序,它在一些有点深度的递归中使用双指针,而且我有一个巨大的内存泄漏,我无法找到它的来源。程序的工作方式是(并且我将在下面发布一些示例代码),其中有一个带有双指针的板对象,称为" board"这是真正的棋盘(它是一个连接4游戏)和另一个双指针叫做#34; newBoard"这是一个名为minimax()的函数(在Board类之外)。
minimax()是递归的,逐步完成游戏可能采取的每条可能路线,因为我根本不想编辑实际的棋盘,我想要复制整个"板"成千上万的对象是不必要的,我认为创造这个" newBoard"复制实际电路板的指针将是最佳选择。
我有删除newBoard的功能,但它不像我喜欢的那样工作。以下是相关的代码:
极大极小():
void Brain::minimax(Board board, int who, int currentCheck, int iter)
{
board.createNewBoard();
if (iter <= MAX_ITER)
{
for (int i = 0; i < w_; i++)
{
if (board.playMove(i, currentCheck))
{
if (winDetect(board, board.getDisc('c')))
{
if (iter == 0)
{
score[i] += 1000;
}
else
score[i] += (MAX_ITER - iter);
}
else if (winDetect(board, board.getDisc('p')))
{
if (iter == 1)
{
score[i] += 500;
}
else
score[i] -= (MAX_ITER - iter);
}
else if (!winDetect(board, board.getDisc('c')) && !winDetect(board, board.getDisc('p')))
{
if (currentCheck == board.getDisc('p'))
currentCheck = board.getDisc('c');
else if (currentCheck == board.getDisc('c'))
currentCheck = board.getDisc('p');
minimax(board, who, currentCheck, iter + 1);
}
}
}
}
}
createNewBoard():
void Board::createNewBoard()
{
newBoard = new int*[h_];
for (int i = 0; i < h_; i++)
newBoard[i] = new int[w_];
}
NB_delete():
void Board::NB_delete()
{
for (int i = 0; i < w_; i++)
delete[] newBoard[i];
delete[] newBoard;
}
我认为这是所有相关代码,但如果您认为可能会有更多相关代码,请告诉我,我会将其包含在内!提前感谢您的帮助。
编辑:已解决
我只是忘记调用我的NB_delete()函数。打电话给它修好了程序!
答案 0 :(得分:0)
据我所知,newBoard
是班级Board
的成员。现在递归调用minimax
,CreateNewBoard
也是如此。这意味着:在CreateNewBoard
中,您在每个连续的递归调用中覆盖newBoard
!这可能是你的记忆泄漏。
如果要以递归方式调用CreateNewBoard
,则每个递归级别都需要一个单独的newBoard
实例。或者newBoard
是一个二维数组,出于这个原因,h_ index表示递归深度?在这种情况下,您不应在迭代2 ... h _。
newBoard
的新实例