Поэтому я пишу программу, которая использует двойной указатель в какой-то довольно глубокой рекурсии, и у меня огромная утечка памяти, источник которой я не могу найти. Программа работает так (а я опубликую ниже пример кода), что существует объект доски с двойным указателем, называемым «доска», который является реальной платой (это игра Connect 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 (). Вызов это исправил программу!
Насколько я вижу, newBoard
является членом класса Board
, Сейчас minimax
называется рекурсивно и так CreateNewBoard
, Это значит: в CreateNewBoard
ты перезаписываешь newBoard
в каждом последующем рекурсивном вызове! Это, вероятно, утечка памяти.
Если CreateNewBoard
должен вызываться рекурсивно, вам нужен отдельный экземпляр newBoard
для каждого уровня рекурсии. Или newBoard
2D массив по той же причине, а индекс h_ обозначает глубину рекурсии? В этом случае вы не должны создавать новый экземпляр newBoard
в итерации 2 … ч_.
Других решений пока нет …