Ошибка в коде: Нарушение прав доступа при чтении!!! Что не так с кодом?

221
22 декабря 2017, 02:05

Задание. Для заданной матрицы размером 8 на 8 найти такие k, что k-я строка матрицы совпадает с k-м столбцом. Найти сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.

Файл "inc.h":

#pragma once
#include<iostream>
#include<time.h>
using namespace std;
namespace MatrixX{
    class Matrix{
    private:
        int **matr;
        int size;
        int number;
        bool Flag;
    public:
        Matrix();
        Matrix(int size); 
        Matrix(Matrix&);
        Matrix& operator = (Matrix&);
        ~Matrix();
        void CreateMatr(int size);
        void Sum();
        int Number();
    };
}

Файл "f.cpp":

#include"inc.h"
MatrixX::Matrix::Matrix() :size(8)
{
    cout << "Default constructor: was create!" << endl;
    matr = new int*[size];
    for (int i = 0; i<size; i++)
        matr[i] = new int[size];
}
MatrixX::Matrix::Matrix(int size){
    this->size = size;
    matr = new int*[size];
    for (int i = 0; i < size; i++){
        matr[i] = new int[size];
    }
}
MatrixX::Matrix::Matrix(Matrix& obj) {
    size = obj.size;
    matr = new int *[size];
    for (int i = 0; i < size; i++) {
        matr[i] = new int[size];
        for (int j = 0; j < size; j++) {
            matr[i][j] = obj.matr[i][j];
        }
    }
}
MatrixX::Matrix& MatrixX::Matrix::operator=(Matrix& obj) {
    if (this == &obj) return *this;
    this->size = obj.size;
    matr = new int*[size];
    for (int i = 0; i < size; ++i)
        matr[i] = new int[size];
    for (int i = 0; i < size; ++i)
        for (int j = 0; j < size; ++j)
            matr[i][j] = obj.matr[i][j];
    return *this;
}
    void MatrixX::Matrix::CreateMatr(int size)
{
    for (int i = 0; i < size; ++i)
    {
        for (int j = 0; j < size; ++j)
        {
            matr[i][j] = rand() % 100 - 50;
            cout << matr[i][j] << '\t';
        }
        cout << endl;
    }
}
    int MatrixX::Matrix::Number(){
    for (int row = 0; row < size; ++row)
    {
        Flag = true;
        for (int column = 0; column < size; ++column)
            if (matr[row][column] != matr[column][row])
            {
                Flag = false;
                break;
            }
        if (Flag == true) number = row + 1;
    }
    cout << "Number = "<<number << endl;
    return number;
}
    void MatrixX::Matrix::Sum(){
    int Sum=0;
    for (int i = 0; i<size; i++)
    {
        for (int j = 0; j<size; j++)
        {
            if (matr[i][j] < 0)
            {
                for (int g = 0; g < size; g++)
                    Sum += matr[i][g];
                cout << "Sum of elements " << i << " row = " << Sum << endl;
                break;
            }
        }
    }
}
    MatrixX::Matrix::~Matrix()
{
    cout << "Destructor: matr was delete!"<<endl;
    for (int i = 0; i<size; i++)
        delete[]matr[i];
    delete[]matr;
}

Файл "main.cpp":

#include"inc.h"
int main(){
    srand(time(NULL));
    int size;
    cout << "Enter size matrix = ";
    cin >> size;
    MatrixX::Matrix matr(size);
    matr.CreateMatr(size);
    matr.Number();
    matr.Sum();
    matr.~Matrix();
    system("pause");
    return 0;
}
Answer 1

Вы зачем-то вызываете деструктор явно

matr.~Matrix();

Потом его вызывает компилятор - при выходе из main(). Результат - двойное освобождение памяти со всеми вытекающими...

И еще - зачем вот это?

void MatrixX::Matrix::CreateMatr(int size)

Зачем передавать размер, если он уже есть в объекте класса? Неужели вы планируете записывать матрицу не полностью? А если укажете размер больше, чем выделено памяти?

READ ALSO
С++ метод половинного деления выводит -nan(ind)

С++ метод половинного деления выводит -nan(ind)

все нормально считает ответ но я не могу его вернуть из функции только на экран вывожу на предпоследней итерации ответ верный а на последней...

197
Реализация AVL дерева в виде класса [требует правки]

Реализация AVL дерева в виде класса [требует правки]

Вот вроде бы нашёл почти реализованый алгоритм на AVL-деревоМне же нужно слепить из этого класс, но узлы у меня через insert добавляются неправильно

150
Ошибка IOexception в Java Android

Ошибка IOexception в Java Android

В приложени в первом активити идет хттп запрос на серверИспользую Okhttp3 для запроса

207
Java и работа с Oracle

Java и работа с Oracle

Решил попробовать написать программу на Java в связке с БД OracleПрограмма будет делать следующее:

163