Всем привет. Я новичок в программировании и только начинаю многое осваивать(хотя и имею кое-какую подготовку, но считать её хоть сколь-либо серьезной смешно). Знакомлюсь с классами, пытаясь соорудить нечто для работы с матрицами. Код реализации не важен, важно то, что получаю ошибку:
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
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;
}
Комментариев нет:
Отправить комментарий