Ошибка при перегрузке операторов + и = C++

116
01 января 2020, 08:40

Я написал класс Vector и перегрузил для него операторы = и +. Код ниже почему-то приводит к аварийному завершению, хотя и выводит правильный результат. Подскажите, пожалуйста, где ошибка в коде?

class Vector {
private:
    unsigned char* vec;
    int len;
public:
    Vector();
    Vector(const Vector&);
    Vector(int n);
    Vector(int n, unsigned char m);
    void print();
    Vector& operator = (const Vector&);
    ~Vector();
    friend Vector operator + (const Vector&, const Vector&);
};
Vector::Vector() : len(0)
{
}
Vector::Vector(const Vector& obj) : len(obj.len)
{
    vec=new unsigned char[len];
    for(int i=0;i<len;i++)
        vec[i]=obj.vec[i];
}
Vector::Vector(int n) : len(n)
{
    vec=new unsigned char[n];
    for(int i=0;i<n;i++)
        vec[i]=0;
}
Vector::Vector(int n, unsigned char m) : len(n)
{
    vec=new unsigned char[n];
    for(int i=0;i<n;i++)
        vec[i]=m;
}
void Vector::print()
{
    for(int i=0;i<len;i++)
        cout << (int)vec[i] << ' ';
}
Vector& Vector::operator = (const Vector& v)
{
    len=v.len;
    for(int i=0;i<len;i++)
        vec[i]=v.vec[i];
    return (*this);
}
Vector::~Vector()
{
    delete[] vec;
}
Vector operator + (const Vector& v1, const Vector& v2)
{
    if (v1.len>=v2.len)
    {
        Vector res(v1.len);
        for(int i=0;i<v2.len;i++)
            res.vec[i]=v1.vec[i]+v2.vec[i];
        for(int i=v2.len;i<v1.len;i++)
            res.vec[i]=v1.vec[i];
        return res;
    }
    else
    {
        Vector res(v2.len);
        for(int i=0;i<v1.len;i++)
            res.vec[i]=v1.vec[i]+v2.vec[i];
        for(int i=v1.len;i<v2.len;i++)
            res.vec[i]=v2.vec[i];
        return res;
    }
}
int main()
{
    int n, el;
    cout << "Enter size of first vector: ";
    cin >> n;
    cout << "Enter value of elements of first vector: ";
    cin >> el;
    Vector a(n, el);
    cout << "Enter size of second vector: ";
    cin >> n;
    cout << "Enter value of elements of second vector: ";
    cin >> el;
    Vector b(n, el);
    Vector res;
    res=a+b;
    res.print();
    return 0;
}
Answer 1

У вас неправильный оператор присваивания.

Vector res;

Вызван конструктор по умолчанию, создал нулевой длины вектор. Кстати, я бы на вашем месте нулил не только длину, но и указатель пустого вектора...

res=a+b;

Возвращается некоторый вектор, который присваивается. Но куда?

Vector& Vector::operator = (const Vector& v)
{
    len=v.len;

Вы говорите, что длина вашего вектора теперь - v.len. Но память вы не выделили...

    for(int i=0;i<len;i++)
        vec[i]=v.vec[i];
    return (*this);
}

И тем не менее в нее пишете. Куда именно? тем более что ваш конструктор по умолчанию вообще поле vec не инициализировал - так что пишете вы "на деревню дедушке Константину Макарычу", вполне при этом портя, например, какие-нибудь служебные структуры менеджера памяти или какие-то данные. А может, и не портя. UB - оно такое undefined...

READ ALSO
Вывести данные о людях, имена которых повторяются

Вывести данные о людях, имена которых повторяются

Возникла трудность при решении такой задачи: дан массив строк, в котором записаны имена и фамилии пользователейНужно вывести пользователей...

130
Ошибки в коде С++

Ошибки в коде С++

Программа находит в строке char последовательности одинаковых символов длинной более 3 символов(кроме пробела) и закидывает эти фрагменты...

151
Как получить широту и долготу выбранной точки в Arcgis?

Как получить широту и долготу выбранной точки в Arcgis?

Я использую примерТут выводятся положения точки на экране :

134
Ошибка при foreach

Ошибка при foreach

Почему ругается? Хочу пройтись по этим символам циклом

453