Хорошо, у меня есть этот конструктор:
Board::Board(int nRows, int nCols){
numRows=nRows;
numCols=nCols;
int** board=new int*[numRows];
for(int i=0; i<numRows; i++){
board[i]=new int[numCols];
for(int j=0; j<numCols; j++){
board[i] [j]=-1;
}
}
}
где плата представляет собой массив из числа строк, где каждый элемент массива указывает на массив длины числа столбцов, поэтому эта плата настроена и инициализируется значениями -1. Мой вопрос заключается в том, как я должен реализовать свой деструктор для такого случая, я понимаю концепцию создания каждого массива указателей, но в уничтожении я все еще немного потерян. Любая помощь приветствуется!
Первый пункт: не делайте этого. Только не надо. Используйте std::vector
для хранения данных и перегрузки оператора пользователя, чтобы клиент мог использовать 2D-измерения для индексации в нем.
Тем не менее, вы, вероятно, будете настаивать на том, чтобы делать это в любом случае, так что вы также можете это сделать, по крайней мере, знаете основную идею: возьмите свои оригинальные new
и переверните их так, чтобы говорить. Итак, вы начали с:
int** board=new int*[numRows];
for(int i=0; i<numRows; i++){
board[i]=new int[numCols];
Инвертируя это, вы начинаете с удаления отдельных элементов:
for (int i=0; i<numRows; i++)
delete [] board[i];
Затем вы удаляете внешний указатель:
delete [] board;
Однако я повторю: гораздо проще использовать std::vector
для хранения.
Для всего, что вы назначили new[]
, вызовите delete[]
, и для всего, что вы назначили new
, вызовите delete
.
Вы делаете одно распределение верхнего уровня new[]
(поэтому для этого нужно delete[]
и другое numRows
new[]
, каждое из которых требует их собственного delete[]
.
Порядок должен быть отменен для освобождения.
Фактический код остается в виде упражнения.
Лучше использовать std::vector<std::vector<int> >;
Но вот что вам нужно
for(int i=0; i<numRows; i++){
delete[] board[i]; //Delete each row allotted inside the for loop
}
delete[] board; //Delete the row/array of pointers