TransWikia.com

Не работают конструктор копирования и деструктор

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;
}

One Answer

Знаете, проблема не там. А в конструкторе

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP