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 уже не существует. Следовательно удаление динамической памяти нужно выполнять непосредственно в пределах видимости массива.
