2015-10-12 34 views
0

因此,我正在編寫一個程序,它在某種程度上較深的遞歸中使用了雙指針,並且我找到了一個巨大的內存泄漏,我找不到源代碼。程序工作的方式是(我會在下面發佈一些示例代碼),它有一個帶有稱爲「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()函數。調用它來修復程序!

+0

你不會顯示任何調用'NB_delete'的地方,並且你可能想要'newBoard = nullptr;'來表明內存不再被分配(並且如果你在刪除後使用它會導致崩潰更快!)。 – crashmstr

+0

你也可能不想清除'Board'參數中傳遞的信息。你不需要那個來確定下一步嗎? – crashmstr

回答

0

據我所見,newBoardBoard類的成員。現在minimax被遞歸地調用,CreateNewBoard也被調用。這意味着:在CreateNewBoard中,您將在每個連續的遞歸調用中覆蓋newBoard!這可能是你的內存泄漏。

如果要遞歸調用CreateNewBoard,則需要爲每個遞歸級別分別創建一個newBoard實例。或者是newBoard二維數組,因爲這個原因,h_索引表示遞歸深度?在這種情況下,你不應該在迭代2 ... h_中創建一個newBoard的新實例。

+0

如果我要擺脫NB_delete()函數,而是在createNewBoard()函數的頂部包含該函數的代碼(用於刪除** newBoard的當前目標),那麼它是否也能工作?我會嘗試一下 – Carson