[英]Trouble finding memory leak (deleting double pointer)
因此,我正在編寫一個在某些深度遞歸中使用雙指針的程序,但我遇到了巨大的內存泄漏,無法找到源。 該程序的工作方式是(下面我將在示例代碼中發布)一個板對象,該板對象帶有一個稱為“ board”的雙指針,這是真正的板(這是一個Connect 4游戲),另一個是“ newBoard”雙指針。 ”,這是稱為minimax()的函數所使用的功能(在Board類之外)。
minimax()是遞歸的,逐步執行游戲可能采取的每條路線,並且由於我根本不想編輯實際的棋盤,因此我認為無數次復制整個“棋盤”對象是不必要的,我認為創建此“ newBoard”指針以復制實際的板將是最佳選擇。
我有一個刪除newBoard的功能,但是無法正常運行。 以下是相關的代碼段:
minimax():
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()函數。 調用它可以修復程序!
據我newBoard
, newBoard
是Board
類的Board
。 現在minimax
被遞歸調用, CreateNewBoard
也被遞歸調用。 這意味着:在CreateNewBoard
您將在每個后續遞歸調用中覆蓋newBoard
! 那可能是您的內存泄漏。
如果要遞歸調用CreateNewBoard
則每個遞歸級別都需要一個單獨的newBoard
實例。 還是出於這個原因, newBoard
是2D數組,並且h_索引表示遞歸深度嗎? 在這種情況下,您不應在迭代2 ... h_中創建newBoard
的新實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.