Ошибка памяти C++

205
10 марта 2017, 00:10
    // Gaus.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
class matrix
{
private:
    int n;
    double **A;
    double *b;
    inline void ifend();
    void filling();
public:
    matrix() :n(0), A(NULL), b(NULL) {}
    matrix(int x) :n(x)
    {
        b = new double[n];
        A = new double *[n];
        for (int i(0); i < n; i++)
        {
            *A = new double[n];
        }
    }
    void constructor();
    void gauss();
    void show();
};
inline void matrix::ifend() //Проверка на заполнение размера матрицы
{
    if (n == 0)
    {
        cout << "The size of matrix not found";
        system("pause");
        exit(0);
    }
}
void matrix::constructor() //Создание системы уравнений
{
    matrix::ifend();
    matrix::filling();
}
void matrix::filling() //Заполнение расширенного массива
{
    matrix::ifend();
    for (int i(0); i < n; i++)
    {
        system("pause");
        for (int j(0); j < n; j++)
        {
            cout << "a" << i + 1 << j + 1 << " = ";
            system("pause");
            cin >> A[i][j];
            system("pause");
        }
        cout << "b" << i << " = ";
        cin >> b[i];
    }
}
void matrix::show()
{
    matrix::ifend();
    for (int i(0); i < n; i++)
    {
        for (int j(0); j < n; j++)
        {
            cout << A[i][j] << " * x" << j + 1;
            if (j == n - 1)
                cout << " = " << b[i];
            else
                cout << " + ";
        }
        cout << endl;
    }
}
int main()
{
    matrix obj1(3);
    obj1.constructor();
    system("pause");
    return 0;
}

Выходит ошибка при заполнении A[2][1] т.е. во второй строчке массива. Я как-то неправильно выделяю память под двумерный массив? Первая строчка заполняется норм.

Answer 1

Вот это

    for (int i(0); i < n; i++)
    {
        *A = new double[n];
    }

замените на

    for (int i(0); i < n; i++)
    {
        A[i] = new double[n];
    }

А то вы всю память только для первого ряда присваиваете...

Answer 2

В этом цикле в конструкторе

    for (int i(0); i < n; i++)
    {
        *A = new double[n];
    }

имеет место утечка памяти, так как при каждой итерации цикла адрес выделяемой памяти перезаписывается в переменной *A, или, что тоже самое, в A[0].

Правильно будет записать цикл как

    for (int i(0); i < n; i++)
    {
        A[i] = new double[n];
    }

Обратите внимание, что у вас дублируется вызов функции ifend

void matrix::constructor() //Создание системы уравнений
{
    matrix::ifend();
    ^^^^^^^^^^^^^^^
    matrix::filling();
}
void matrix::filling() //Заполнение расширенного массива
{
    matrix::ifend();
    ^^^^^^^^^^^^^^^

Можно убрать этот вызов из функции filling

READ ALSO
is upper для русского языка

is upper для русского языка

Нужен способ проверять первый символ переменной типа std::string на принадлежность к верхнему регистру с учетом правил русского языкаЕсть что-то...

208
Не могу найти ошибку в коде c++

Не могу найти ошибку в коде c++

Есть задание: из текста, в котором 2 до 40 слов, в каждом из которых от 1 до 6 строчных латинских букв; между соседними словами – не менее одного...

202
contentEditable отступ( tab)

contentEditable отступ( tab)

Есть пример нижеКак сделать так, чтобы при нажатии Tab вставлялся отступ в тексте (абзац) вместо перехода к следующему элементу страницы?

236
javascript letter to digit hex

javascript letter to digit hex

Необходима функция, переводящая в десятичные числа hex буквыA -> 10, F -> 15 и тд

230