因此,我正在編寫一個程序,它在某種程度上較深的遞歸中使用了雙指針,並且我找到了一個巨大的內存泄漏,我找不到源代碼。程序工作的方式是(我會在下面發佈一些示例代碼),它有一個帶有稱爲「board」的雙指針的板對象,它是真正的板(這是一個連接4遊戲)和另一個雙指針,稱爲「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()函數。調用它來修復程序!
你不會顯示任何調用'NB_delete'的地方,並且你可能想要'newBoard = nullptr;'來表明內存不再被分配(並且如果你在刪除後使用它會導致崩潰更快!)。 – crashmstr
你也可能不想清除'Board'參數中傳遞的信息。你不需要那個來確定下一步嗎? – crashmstr