Не могу понять процесс создания динамической матрицы в коде

Вот сам код:

#include<iostream>

using namespace std;

int main() {
    int n, m, max, min, max_i = 0 , min_i = 0; // n - размер строки, m - столбца
    cout << "Input n, m:\n";
    cin >> n >> m;

    int** mtr = new int* [m]; // выделение памяти под матрицу с использованием указателей (динамически)
    for (int i = 0; i < m; i++) {
        mtr[i] = new int[n];
    }
    cout << "Input matrix " << n << " x " << m << ":\n";

    
    for (int i = 0; i < m; i++) { // вводим значения матрицы
        for (int j = 0; j < n; j++) {
            cin >> mtr[i][j];
        }
    }

    min = max = mtr[0][0]; // пусть минимальный и максимальный - первый элемент матрицы

    for (int i = 0; i < m; i++) { // проходимся по всем элементам матрицы и ищем максимальный и минимальный элемент
        for (int j = 0; j < n; j++) {
            if (mtr[i][j] > max) {
                max = mtr[i][j];
                max_i = i;
            }
            if (mtr[i][j] < min) {
                min = mtr[i][j];
                min_i = i;
            }
        }
    }

    if (max_i != min_i) { // если min и max в одной строке то ничего не меняем
        for (int j = 0; j < n; j++) { // меняем строки местами
            swap(mtr[min_i][j], mtr[max_i][j]); // вместо swap можем менять элементы нативно
        }
    }

    cout << "\nMatrix:\n";
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cout << mtr[i][j] << ' ';
        }
        cout << '\n';
    }

    for (int i = 0; i < m; i++) { // освобождаем память занятую под матрицу в строках 12, 14
        delete[] mtr[i];
    }
    delete[] mtr;

    return 0;
}

Не понимаю, что происходит тут:

int** mtr = new int* [m]; // выделение памяти под матрицу с использованием указателей (динамически)
    for (int i = 0; i < m; i++) {
        mtr[i] = new int[n];

И тут:

for (int i = 0; i < m; i++) { // освобождаем память занятую под матрицу в строках 12, 14
        delete[] mtr[i];
    }
    delete[] mtr;

То есть я прочитал, что выделяется память под использование матрицы и что после выполнения кода память освобождается, но я не понимаю что происходит по существу. Дайте, пожалуйста, построчный комментарий к выделенным строкам.


Ответы (1 шт):

Автор решения: Barsik

Выделение памяти под матрицу

int** mtr = new int* [m]; // выделение памяти под матрицу с использованием указателей (динамически)

Эта строка выделяет память под массив указателей на целые числа. Каждый указатель будет указывать на строку в матрице. Количество указателей равно количеству строк в матрице (m).

for (int i = 0; i < m; i++) {
    mtr[i] = new int[n];
}

Этот цикл выделяет память под каждую строку в матрице. Для каждой строки выделяется массив целых чисел. Количество целых чисел в каждой строке равно количеству столбцов в матрице (n).

Освобождение памяти

for (int i = 0; i < m; i++) { // освобождаем память занятую под матрицу в строках 12, 14
    delete[] mtr[i];
}

Этот цикл освобождает память, выделенную под каждую строку в матрице.

delete[] mtr;

Эта строка освобождает память, выделенную под массив указателей на строки.

Построчный комментарий

// Выделение памяти под массив указателей на строки
int** mtr = new int* [m]; 

// Цикл по строкам матрицы
for (int i = 0; i < m; i++) {
    // Выделение памяти под строку матрицы
    mtr[i] = new int[n];
}

// Цикл по строкам матрицы
for (int i = 0; i < m; i++) {
    // Освобождение памяти, выделенной под строку матрицы
    delete[] mtr[i];
}

// Освобождение памяти, выделенной под массив указателей на строки
delete[] mtr;

Надеюсь что помог!

→ Ссылка