V
Vadik(R)
Добрый вечер-ночи, уважаемые форумчане.
Недавно наткнулся на такую интересную вещь, которую никак объяснить не могу. Вот код:
Тут реализуется класс многочлен, где задаётся его степень и сами коэффициенты. Делается динамическим выделением памяти.
Для примера создал два многочлена:
1: x^2 - 2x + 1
2: x - 1
И решил их сложить.
Так вот, проблема вся в том, что если программа в режиме Release, то он их отлично складывает и выводит результат на экран.
А вот если она в Debug, то выдаётся ошибка:
Как такое происходит? Как этого избежать? Можно в деструкторе закомментировать //free(k); , тогда ошибка выдаваться не будет, но будет утечка памяти. Прошу совета, как быть в такой ситуации, что в коде не так? С помощью cout'ов я понял, что ошибка выдаётся именно в деструкторе, но больше ничего понять не могу.
Недавно наткнулся на такую интересную вещь, которую никак объяснить не могу. Вот код:
C++:
#include <iostream>
#include <locale>
using namespace std;
int max(int a, int b)
{
return a > b ? a : b;
}
class Polynom
{
public:
Polynom()
{
n = 1;
k = (int*) malloc(n * sizeof(int));
k[0] = 0;
}
Polynom(int n, int k[])
{
this->n = n;
this->k = (int*) malloc(this->n * sizeof(int));
memcpy(this->k, k, this->n * sizeof(int));
}
Polynom& operator=(Polynom &other)
{
cout << "Start operator=" << endl;
this->n = other.n;
this->k = (int*) malloc(this->n * sizeof(int));
memcpy(this->k, other.k, this->n * sizeof(int));
cout << "End operator=" << endl;
return *this;
}
~Polynom()
{
cout << "Start free k" << endl;
free(k);
cout << "End free k" << endl;
}
int rank()
{
return n;
}
int operator[] (int index)
{
return k[index];
}
Polynom sum(Polynom &a, Polynom &b)
{
int i;
int* k;
int n;
Polynom c;
n = max(a.rank(), b.rank());
k = (int*) malloc(n * sizeof(int));
for (i = 0; i < n; i++)
{
k[i] = 0;
if (i < a.rank())
{
k[i] += a[i];
}
if (i < b.rank())
{
k[i] += b[i];
}
}
c = Polynom(n, k);
free(k);
return c;
}
void Print()
{
int i;
for (i = 0; i < n; i++)
{
if (i)
{
printf("+ ");
}
printf("%d * a ^ %d ", k[n - i - 1], n - i - 1);
}
printf("\r\n");
}
private:
int* k;
int n;
};
int main()
{
int k[10];
Polynom a;
Polynom b;
k[0] = 1;
k[1] = -2;
k[2] = 1;
a = Polynom(3, k);
k[0] = -1;
k[1] = 1;
b = Polynom(2, k);
a = a.sum(a, b);
a.Print();
return 0;
}
Для примера создал два многочлена:
1: x^2 - 2x + 1
2: x - 1
И решил их сложить.
Так вот, проблема вся в том, что если программа в режиме Release, то он их отлично складывает и выводит результат на экран.
А вот если она в Debug, то выдаётся ошибка:
Как такое происходит? Как этого избежать? Можно в деструкторе закомментировать //free(k); , тогда ошибка выдаваться не будет, но будет утечка памяти. Прошу совета, как быть в такой ситуации, что в коде не так? С помощью cout'ов я понял, что ошибка выдаётся именно в деструкторе, но больше ничего понять не могу.