Устранение утечки памяти (удаление двойного указателя)

Поэтому я пишу программу, которая использует двойной указатель в какой-то довольно глубокой рекурсии, и у меня огромная утечка памяти, источник которой я не могу найти. Программа работает так (а я опубликую ниже пример кода), что существует объект доски с двойным указателем, называемым «доска», который является реальной платой (это игра 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 (). Вызов это исправил программу!

0

Решение

Насколько я вижу, newBoard является членом класса Board, Сейчас minimax называется рекурсивно и так CreateNewBoard, Это значит: в CreateNewBoard ты перезаписываешь newBoard в каждом последующем рекурсивном вызове! Это, вероятно, утечка памяти.

Если CreateNewBoard должен вызываться рекурсивно, вам нужен отдельный экземпляр newBoard для каждого уровня рекурсии. Или newBoard 2D массив по той же причине, а индекс h_ обозначает глубину рекурсии? В этом случае вы не должны создавать новый экземпляр newBoard в итерации 2 … ч_.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector