Страницы

Поиск по вопросам

вторник, 2 апреля 2019 г.

C++. Правильное удаление динамического двумерного массива

Всем привет. Я новичок в программировании и только начинаю многое осваивать(хотя и имею кое-какую подготовку, но считать её хоть сколь-либо серьезной смешно). Знакомлюсь с классами, пытаясь соорудить нечто для работы с матрицами. Код реализации не важен, важно то, что получаю ошибку: http://prntscr.com/e6y5on Ключевой вопрос в том, как её исправить.
Matrix.h:
#ifndef MATRIX_H #define MATRIX_H
class Matrix { private: int m_rows = 1; int m_cols = 1; int** m_matrix = new int* [m_rows];
public: Matrix(int rows, int cols);
void SetSize(int rows, int cols); void Create();
int rows(); int cols();
~Matrix();
}; #endif
Matrix.cpp:
#include #include #include "matrix.h"
using namespace std;
Matrix::Matrix(int rows, int cols) { SetSize(rows, cols); Create(); }
void Matrix::SetSize(int rows, int cols) { m_rows = rows; m_cols = cols; }
void Matrix::Create() { for (int i = 0; i < m_rows; i++) m_matrix[i] = new int[m_cols];
cout << "Matrix created with " << m_rows << " rows and " << m_cols << " cols." << endl; }
int Matrix::rows() { return m_rows; }
int Matrix::cols() { return m_cols; }
Matrix::~Matrix() { for (int i = 0; i < m_rows; i++) delete[] m_matrix[i];
delete[] m_matrix; cout << "Matrix deleted" << endl; }
main.cpp:
int main() { Matrix m(2,2); return 0; }
При пошаговой проверке в Visual Studio программа сыплется на удалении внешнего указателя delete[] m_matrix; Собственно, прошу помочь =)


Ответ

Давайте разбираться.
int m_rows = 1; int m_cols = 1; int** m_matrix = new int* [m_rows];
Итак, у вас сразу выделяется память и создается матрица 1x1. Поскольку в конструкторе
Matrix::Matrix(int rows, int cols)
у вас нет инициализации членов, они инициализированы по умолчанию этой матрицей. Но что вы делаете дальше? Вы переписываете m_rows и m_cols, и в уже выделенный массив для ОДНОГО указателя записываете их m_rows, т.е. в данном конкретном случае - два.
Вот вам и источник ваших неприятностей. Ваша попытка исправить ситуацию - это просто попытка не заметить ошибку. Ни к чему хорошему привести это не может. В следующий раз вы запишете туда их с десяток, и таки засорите память основательнее, только и всего.
Вот как по-хорошему должна выглядеть ваша матрица:
class Matrix { private: int m_rows; int m_cols; int** m_matrix;
public: Matrix(int rows, int cols);
void SetSize(int rows, int cols); void Create();
int rows(); int cols();
~Matrix();
};

Matrix::Matrix(int rows, int cols) :m_rows(rows),m_cols(cols) { m_matrix = new int*[m_rows]; for (int i = 0; i < m_rows; i++) m_matrix[i] = new int[m_cols];
cout << "Matrix created with " << m_rows << " rows and " << m_cols << " cols." << endl; }
Matrix::~Matrix() { for (int i = 0; i < m_rows; i++) delete[] m_matrix[i];
delete[] m_matrix; cout << "Matrix deleted" << endl; }

Комментариев нет:

Отправить комментарий