c++ возникает ошибка при срабатывании деструктора

Вот весь код, ошибка срабатывает на этапе присваивания Polinom e = b.AddP(c); и конкретно при срабатывании деструктора.

    #include <iostream>
    #include <time.h>
    #include <stdlib.h>

    using namespace std;

    class Polinom
    {
    private:
    int n;
    int *arr;
public:
    Polinom()
    {
        n = 0;
        arr = nullptr;
    }
    Polinom(int x)
    {

        n = x;
        arr = new int[x+1];

        for (int i = 0; i <= n; i++)
        {   
            arr[i] = rand() %10+1;
        }
    }
    Polinom(const Polinom & other)
    {
        this->arr = new int[other.n+1];
        this->n = other.n;
        for (int i = 0; i <= n; i++)
        {
            arr[i] = other.arr[i];
        }
    }
    ~Polinom()
    {
        delete[] arr;
    }
    int GetN()
    {
        return n;
    }
    bool Compar(const Polinom& other)
    {
        if (n != other.n)
            return 0;
        else
        {
            for (int i = 0; i <= n; i++)
            {
                if (this->arr[i] != other.arr[i])
                    return 0;
            }
            return 1;
        }
    }
    void Input()
    {
        cout << "Enter polinomial degree\t";
        cin >> this->n;
        if (n != 0)
        {
            cout << "enter coefficients for variables" << endl;
            this->arr = new int[this->n+1];
            for (int i = 0; i <= this->n; i++)
            {
                cout <<"for "<< i << " degree =>  ";
                cin >> this->arr[i];
            }
        }
        else
            this->arr = nullptr;
    }
    void Output()
    {

        cout << "n = " << this->n<<"\t polinom: ";
        if (n != 0)
        {
            for (int i = 0; i <= n; i++)
            {
                if (i != n)
                cout << arr[i] << "*x^(" << i << ") + ";
                else
                    cout << arr[i] << "*x^(" << i << ")" << endl;
            }
        }
            cout << endl<<endl;
    }
    Polinom& AddP(const Polinom& m2)
    {
        if (n>m2.n)
        {
            Polinom M(*this);
            for (int i = 0; i <= m2.n; i++)
            {
                M.arr[i] += m2.arr[i];
            }

            return  M;
        }
        else
        {
            Polinom M(m2);
            for (int i = 0; i <= n; i++)
            {
                M.arr[i] += arr[i];
            }

            return M;
        }
    }
    Polinom SubP(const Polinom& m2)
    {
        if (n>m2.n)
        {
            Polinom M(*this);
            for (int i = 0; i <= m2.n; i++)
            {
                M.arr[i] -= m2.arr[i];
            }
            return M;
        }
        else
        {
            Polinom M(m2);
            for (int i = 0; i <= m2.n; i++)
            {
                if (i <= n)
                    M.arr[i] -= arr[i];
                else
                    M.arr[i] *= (-1);
            }
            return M;
        }
    }
    Polinom Plus_num(int k)
    {
        arr[0] += k;
        return *this;
    }
    Polinom Mult_num(int k)
    {
        for (int i = 0; i <= n; i++)
        {
            arr[i] *= k;
        }
        return *this;
    }
    int Calc(int x)
    {
        int res = 0;
        if (arr != nullptr)
        {

            for (int i = 0; i <= n; i++)
            {
                int k = 1;
                for (int j = 1; j <= i; j++)
                {
                    k *= k;
                }
                res += arr[i] * k;
            }
        }
        return res;
    }
    Polinom Der()
    {
        Polinom res;
        res.n = n-1;
        res.arr = new int[res.n+1];
        for (int i = 0; i <= res.n; i++)
        {
            res.arr[i] = this->arr[i + 1] * (i + 1);
        }
        return res;
    }
    };

    int main()
    {
        srand(time(NULL));
        Polinom a, b(3), c(b);
        bool comp = b.Compar(c);
        cout << comp << endl;
        int n1 = b.GetN();
        Polinom d;
        d.Input();
        d.Output();
        c.Output();
        Polinom e = b.AddP(c);
        e.Output();
        Polinom f = e.SubP(d);
        f.Output();
        f.Plus_num(17);
        f.Output();
        d.Mult_num(2);
        d.Output();
        int ca = d.Calc(3);
        cout << ca << endl;
        Polinom g = f.Der();
        f.Output();

    }

Ошибка


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

Автор решения: Артем Мартюхин

К моменту выполнения деструктора arr уже не существует. Следовательно удаление динамической памяти нужно выполнять непосредственно в пределах видимости массива.

→ Ссылка