Stack Overflow на русском Asked by iwacam on November 9, 2020
Не могу понять почему не работают конструктор копирования и деструктор. Отладчик в конструкторе на строчке "_matrixArray[i][j] = other._matrixArray[i][j]" пишет:"Exception thrown: read access violation.
other._matrixArray was 0xCDDDCDDE."
{
public:
MATRIX_API Matrix(size_t sizeOfRows, size_t sizeOfCollumns); //конструктор создающий матрицу с нулевыми элементами
MATRIX_API Matrix(const Matrix& other); //конструктор копирования
MATRIX_API ~Matrix();
//MATRIX_API bool InputArrayFromFile(double** arr, int _sizeOfRows, int _sizeOfCollumns, const char* fileName);
private:
int _sizeOfRows=0;
int _sizeOfCollumns=0;
int** _matrixArray;
};
Matrix::Matrix(size_t sizeOfRows, size_t sizeOfCollumns)
:_sizeOfRows(sizeOfRows), _sizeOfCollumns(sizeOfCollumns)
{
int** _matrixArray = new int*[_sizeOfRows];
for (int i = 0; i < _sizeOfRows; ++i)
_matrixArray[i] = new int[_sizeOfCollumns];
for (int i = 0; i < _sizeOfRows; ++i)
{
for (int j = 0; j < _sizeOfCollumns; ++j)
{
_matrixArray[i][j] = 0;
std::cout << _matrixArray[i][j] << " ";
}
std::cout << std::endl;
}
std::cout << "I am constructor and i am working now!"<<std::endl;
}
Matrix::Matrix(const Matrix& other) //конструктор копирования
:_sizeOfRows(other._sizeOfRows),_sizeOfCollumns(other._sizeOfCollumns)
{
if (other._matrixArray && other._sizeOfRows && other._sizeOfCollumns)
{
_matrixArray = new int*[_sizeOfRows];
for (int i = 0; i < this->_sizeOfRows; ++i)
_matrixArray[i] = new int[_sizeOfCollumns];
for (int i = 0; i < _sizeOfRows; ++i)
{
for (int j = 0; j < _sizeOfCollumns; ++j)
{
_matrixArray[i][j] = other._matrixArray[i][j];
std::cout <<this-> _matrixArray[i][j] << " ";
}
std::cout << std::endl;
}
std::cout << "I am constructor of copy and i am working now!" << std::endl;
}
}
Matrix::~Matrix()//деструктор
{
for (int i = 0; i < this->_sizeOfRows; ++i)
{
delete[] this->_matrixArray[i];
}
delete[] _matrixArray;
}
Знаете, проблема не там. А в конструкторе
Matrix::Matrix(size_t sizeOfRows, size_t sizeOfCollumns)
Хотя в классе определено поле
int** _matrixArray;
в этом конструкторе вы определяете его заново:
Matrix::Matrix(size_t sizeOfRows, size_t sizeOfCollumns)
:_sizeOfRows(sizeOfRows), _sizeOfCollumns(sizeOfCollumns)
{
int** _matrixArray = new int*[_sizeOfRows]; // <------ !!!!!!!!!
for (int i = 0; i < _sizeOfRows; ++i)
Так что вы получаете утечку памяти и не инициализированное корректно поле _matrixArray
в созданном объекте. Понятно, что при копировании такого объекта у вас начинаются сплошные неприятности...
Correct answer by Harry on November 9, 2020
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP