找不到内存泄漏(删除双指针)

时间:2015-10-12 15:58:28

标签: c++ pointers memory-leaks double-pointer

所以我正在编写一个程序,它在一些有点深度的递归中使用双指针,而且我有一个巨大的内存泄漏,我无法找到它的来源。程序的工作方式是(并且我将在下面发布一些示例代码),其中有一个带有双指针的板对象,称为" 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()函数。打电话给它修好了程序!

1 个答案:

答案 0 :(得分:0)

据我所知,newBoard是班级Board的成员。现在递归调用minimaxCreateNewBoard也是如此。这意味着:在CreateNewBoard中,您在每个连续的递归调用中覆盖newBoard!这可能是你的记忆泄漏。

如果要以递归方式调用CreateNewBoard,则每个递归级别都需要一个单独的newBoard实例。或者newBoard是一个二维数组,出于这个原因,h_ index表示递归深度?在这种情况下,您不应在迭代2 ... h _。

中创建newBoard的新实例