簡體   English   中英

找不到內存泄漏(刪除雙指針)

[英]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()函數。 調用它可以修復程序!

據我newBoardnewBoardBoard類的Board 現在minimax被遞歸調用, CreateNewBoard也被遞歸調用。 這意味着:在CreateNewBoard您將在每個后續遞歸調用中覆蓋newBoard 那可能是您的內存泄漏。

如果要遞歸調用CreateNewBoard則每個遞歸級別都需要一個單獨的newBoard實例。 還是出於這個原因, newBoard是2D數組,並且h_索引表示遞歸深度嗎? 在這種情況下,您不應在迭代2 ... h_中創建newBoard的新實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM