#include #include #include "crtdynmem.h" #include "hw2D.h" using namespace std; int main() { setlocale(LC_ALL, "Rus"); cout << fixed << setprecision(2); //форматный вывод - два знака после десятичной точки // Cоздаём точку отсчёта для учёта динамически выделяемой памяти _CrtMemState _ms; _CrtMemCheckpoint(&_ms); // Два возможных варианта работы // с двумерными массивами в динамической памяти: // Вариант 1. Уплотненные (двумерный массив хранится как одномерный) // массив хранится в непрерывном блоке памяти, double *a = nullptr; // иницилизация указателей при объявлении – залог успешной отладки // Плюсы: память выделяется только под элементы массива; // линейная организация позволет легко кешировать весь массив; // освобождается одним delete[]. // Минусы: нельзя использовать адресацию с двумя индексами a[i][j]; // добавление, удаление строк ведёт к пересозданию всего массива. size_t rows, cols; //size_t.Базовый беззнаковый целочисленный тип языка Си / Си++. //Является типом результата, возвращаемого оператором sizeof. read_new(a, rows, cols); print(a, rows, cols); // boolalpha - вывод булевых переменных в виде true/false cout << "В матрице есть нулевые строки: " << boolalpha << has_zero_row(a, rows, cols) << endl; cout << "В матрице есть нулевые столбцы: " << boolalpha << has_zero_col(a, rows, cols) << endl; delete[] a;//освобождение памяти, выделенной под массив a = nullptr;//обнуление указателя // Вариант 2. Разреженные double **m = nullptr; // массив указателей на отдельные строки // Плюсы: можно адресовать с двумя индексами m[i][j]; // строками можно манипулировать как элементами m[i], // добавление, удаление одной строки не влияет на остальные. // Минусы: отдельный массив под каждую строку препятствует кешированию всей матрицы процессором // замедляя работу с большими данными; // каждую строку нужно освобождать отдельно, иначе будут утечки памяти. read_new(m, rows, cols); print(m, rows, cols); cout << "В матрице есть нулевые строки: " << boolalpha << has_zero_row(m, rows, cols) << endl; cout << "В матрице есть нулевые столбцы: " << boolalpha << has_zero_col(m, rows, cols) << endl; //delete_matrix(m, rows); // Ошибка – не освобождена динамическая память! // выведем все утечки памяти с начала отсчёта _CrtMemDumpAllObjectsSince(&_ms); // Выведем все утечки памяти с момента начала работы _CrtDumpMemoryLeaks(); //Результат смотреть в окне вывода данных отладки system("pause"); return 0; }