массивы — падение после использования оператора new [] в переполнении стека

У меня есть класс Vector с полями массива и размера. Когда каждый из двух массивов v1 и v2 имеет более одного элемента, возникает проблема с выделением памяти для этого массива в операторе копирования. Как я могу это исправить? Вот код:

#include<iostream>
using namespace std;

class Vector
{
private:
unsigned size;
double *arr;
public:
Vector();
Vector(double *arr, unsigned size);
Vector(const Vector &copy);
Vector &operator= (const Vector &vector);
friend Vector operator+ (const Vector &varLeft, const Vector &varRight);
friend ostream & operator<< (ostream &output, const Vector &var);
friend istream & operator>> (istream &input, Vector &var);
};

int unitTest();

int main()
{
unitTest();

system("pause");
return 0;
}
int unitTest()
{
Vector v1;
cin >> v1;
Vector v2;
cin >> v2;
Vector v3;

cout << "Your Vector v1:" << endl;
cout << v1 << endl;
cout << "Your Vector v2:" << endl;
cout << v2 << endl;

cout << "Arrays +:" << endl;
v3 = v1 + v2;
cout << v3 << endl;

return 0;
}
Vector::Vector()
{
arr = new double[size];
};

Vector::Vector(double *arr, unsigned size) : size(size)
{
arr = new double[size];
for (int i = 0; i < size; ++i)
{
this->arr[i] = arr[i];
}
};

Когда оператор + возвращает значение, моя программа падает после строки ‘arr = new double [size];’ в операторе копирования.

Vector::Vector(const Vector &copy)
{
size = copy.size;
arr = new double[size];
for (int i = 0; i < size; ++i)
{
arr[i] = copy.arr[i];
}
}
Vector operator+ (const Vector &varLeft, const Vector &varRight)
{
Vector res;
res.size = varLeft.size;

if (varLeft.size == varRight.size)
{
for (int i = 0; i < res.size; ++i)
{
res.arr[i] = varLeft.arr[i] + varRight.arr[i];
}
}
else
{
cout << "Error. Vectors have different size." << endl;
}
return res;
}
ostream & operator<< (ostream &output, const Vector &var)
{
for (int i = 0; i < var.size; ++i)
{
output << ' ';
output << var.arr[i];
}
output << endl;
return output;
}

istream & operator>> (istream &input, Vector &var)
{
cout << "Enter size of array --> ";
input >> var.size;
var.arr = new double[var.size];
for (int i = 0; i < var.size; ++i)
{
cout << "Enter " << i + 1 << " element --> ";
input >> var.arr[i];
}
return input;
}
Vector & Vector::operator= (const Vector &vector)
{
if (this != &vector)
{
if (arr != 0)
{
delete[]arr;
}
size = vector.size;
arr = new double[size];

for (int i = 0; i < size; ++i)
{
arr[i] = vector.arr[i];
}
}
return *this;
}

3

Решение

Вы никогда не инициализируете Vector::size в конструкторе по умолчанию, поэтому поведение вашей программы не определено. Вам нужно инициализировать ваш Vectorразмер до размещения вашего массива.

Также для вашего operator+ вам нужно будет либо добавить Vector конструктор, который принимает размер или перераспределяет ваш массив после изменения resразмер.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector