C/C++

Программирование, динамическое выделение памяти в конструкторе класса

Есть небольшая проблема.
При выделении памяти под матрицу в конструкторе класса, хранящего в себе непосредственно матрицу, и при попытке записи в эту матрицу чисел вылетает исключение
"Нарушение прав доступа при записи по адресу"
Выделение памяти вопросов вызывать не должно...
/////////////////////////////////////////////////////////////////////////////////////////////////////
piblic:
double **mainPtr;
mainPtr = new double*[Height];
for (int i = 0; i < Height; i++) {
mainPtr[i] = new double[Width];
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
Обращение к матрице при попытке записи в нее значений выглядит так:
/////////////////////////////////////////////////////////////////////////////////////////////////////
void Matrix::FillMatrix(int iIndex, int jIndex, double number) {
mainPtr[iIndex][jIndex] = number;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
Сидел на многих тематических сайтах но так и не понял в чем моя ошибка)
Совсем недавно начал изучать классы и поэтому могу не знать некоторых нюансов.
#include <iostream>
#include <iomanip>
using namespace std;
class Matrix {
public:
Matrix() = delete;
Matrix(Matrix&&) = delete;
Matrix& operator=(Matrix&&) = delete;
Matrix(const size_t rows, const size_t cols)
: row(rows), col(cols), matrix(new double*[rows]) {
for (auto i = 0U; i < rows; ++i) {
matrix[i] = new double[cols];
for (auto j = 0U; j < row; ++j) {
matrix[i][j] = 0.0;
}
}
}
Matrix(const Matrix& mx)
: row(mx.row), col(mx.col), matrix(new double* [row]) {
for (auto i = 0U; i < row; ++i) {
matrix[i] = new double[col];
for (auto j = 0U; j < row; ++j) {
matrix[i][j] = mx.matrix[i][j];
}
}
}
~Matrix() {
if (matrix != nullptr) {
for (auto i = 0U; i < row; ++i) {
delete[] matrix[i];
}
delete[] matrix;
matrix = nullptr;
}
}
Matrix& operator=(const Matrix& mx) {
if (&mx != this) {
for (auto i = 0U; i < row; ++i) {
delete[] matrix[i];
}
delete[] matrix;
row = mx.row;
col = mx.col;
matrix = new double* [row];
for (auto i = 0U; i < row; ++i) {
matrix[i] = new double[col];
for (auto j = 0U; j < row; ++j) {
matrix[i][j] = mx.matrix[i][j];
}
}
}
return *this;
}
double*& operator[](const int i)const {
return matrix[i];
}
size_t rows()const {
return row;
}
size_t columns()const {
return col;
}
private:
size_t row;
size_t col;
double** matrix;
};
int main() {
Matrix matrix(2, 4);
puts("Input matrix 2 x 4");
for (auto i = 0U; i < matrix.rows(); ++i) {
for (auto j = 0U; j < matrix.columns(); ++j) {
cin >> matrix[i][j];
}
}
system("cls");
puts("Copy of the matrix 2 x 4");
Matrix other = matrix;
for (auto i = 0U; i < other.rows(); ++i) {
for (auto j = 0U; j < other.columns(); ++j) {
cout << setw(5) << matrix[i][j] << ' ';
}
puts("");
}
system("pause > nul");
}
Павел Петрович
Павел Петрович
51 986
Лучший ответ
Нету тут никаких нюансов. Код самого класса правильный.

Ну, разве что то, что размеры матрицы следовало бы сохранять в полях в момент создания класса. Тогда в FillMatrix можно будет добавить assert'ы, которые будут проверять, не выходят ли индексы за пределы матрицы, а если выходят - выбрасывать исключение, в котором указывать, какой из двух размеров превышен, какой индекс передан в FillMatrix и каков фактический размер.
Профессионал бы сделал именно так.
И это помогло бы найти проблему в том коде, где ты пользуешься этим классом. Она именно там.
TV
Tankist. Vlasov.
92 464
Алексей Трушников Привет, проблема в том что у меня после вызова конструктора сразу вызывается деструктор
Не знаю как я это понял, просто решил поставить точку останова в деструкторе и был удивлен
Как можно этого избежать?
На форумах пишут о правиле 3-х, но я искренне не понимаю как мне это поможет решить проблему)
Алексей Трушников Конструктор явно не вызывается
Объявляется автоматический объект
Объект автоматически уничтожается, когда он выходит за пределы видимости