Деструктор для массива указателей на массивы

0

Хорошо, у меня есть этот конструктор:

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. Мой вопрос заключается в том, как я должен реализовать свой деструктор для такого случая, я понимаю концепцию создания каждого массива указателей, но в уничтожении я все еще немного потерян. Любая помощь приветствуется!

Теги:
arrays
pointers
destructor

3 ответа

4

Первый пункт: не делайте этого. Только не надо. Используйте 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 для хранения.

  • 0
    Я хотел бы использовать векторы, я понимаю векторы, но мне не разрешено использовать векторы для этого класса. Точная помощь
2

Для всего, что вы назначили new[], вызовите delete[], и для всего, что вы назначили new, вызовите delete.

Вы делаете одно распределение верхнего уровня new[] (поэтому для этого нужно delete[] и другое numRows new[], каждое из которых требует их собственного delete[].

Порядок должен быть отменен для освобождения.

Фактический код остается в виде упражнения.

1

Лучше использовать 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню