Если размер динамического массива задан числом, которое больше 2, то происходит сбой программы

Программа должна считать модуль вектора по заданным координатам. переменная "num" задаёт размер динамического массива и кол-во координат вектора. В методе "GetCoord" массив заполняется координатами. Странности происходят в методе "calc", где происходят окончательные вычисления: подсчёт суммы квадратов координат и вычисление квадратного корня из полученного числа. Если задать кол-во координат(размерность массива) равное 2, то всё работает исправно, однако при задании переменной "num" числа большего чем 2 получаются какие-то фокусы: либо результат остаётся пустым и "ModVector.exe вызвал срабатывание точки останова", либо крашится программа.

#include <iostream>
#include <cmath>
using namespace std;
class Vector {
private:
    double count;
    int num;
    int* CoordArr = new int[num];
public:
    Vector() :count(0), num(0) {};
    int dimension();
    int GetCoord();
    double calc();
};

int Vector::dimension() {
    cout << "Введите размерность пространства ";
    cin >> num;
    cout << endl;
    return 0;
}

int Vector::GetCoord() {
    cout << "Введите координаты вектора поочерёдно "<<endl;
    for (int i = 0; i < num; i++) {
        cin >> CoordArr[i];
    }
    cout << endl;
    return 0;
}

double Vector::calc() {
    for (int i = 0; i < num; i++) {
        count += pow(CoordArr[i],2);
    }
    cout << "Результат вычисления: ";
    cout << sqrt(count);
    return 0;
}

int main() {
    setlocale(LC_ALL,"russian");
    Vector vect;
    vect.dimension();
    vect.GetCoord();
    vect.calc();
    return 0;
}'

Ответы (1 шт):

Автор решения: Slava

Проблема в том, что инициализация динамического массива происходит в конструкторе класса Vector в этой строке:

Vector vect;

далее вы в методе Vector::dimension() меняете n, но память при этом не пересоздастся магически, указатель CoordArr как указывал на результат операции new int[0] так и продолжает указывать. Самый простой способ исправить - запрашивать n вне класса и передавать его конструктору при создании:

Vector( int n ) :count(0), num(n) {};

и далее в main()

int n = 0;
cout << "Введите размерность пространства ";
cin >> n;
Vector vect( n );

То, что программа у вас "работала" для 2х, просто совпадение, при других условиях она и при 2х работать не будет, поскольку вы всегда инициализировали указатель адресом массива нулевого размера.

Кроме того вы нарушаете известное правило трех. На визуальном поведении программы это не скажется, но у вас прямо сейчас утечка памяти. Поэтому лучше сразу эту ситуацию исправить, тем более она требует минимальных усилий. А лучше сразу использовать "умный" указатель.

→ Ссылка