Деструктор, возвращающий временный объект

Я не понимаю, в чем проблема при возврате временного объекта. Если я не использую деструктор, то все в порядке. Но с деструктором это создает проблему. Коэффициенты для полинома 1 и 2 печатаются правильно. Полином 3 также. Но после сложения coeff[1] и coeff[2] полинома 3 не дали правильного значения. Кто-нибудь может помочь?

#include<iostream>

using namespace std;

class poly{
public:
float* coeff;
int degree;
int arr_size;
/*default constructor*/
poly(){
    coeff = new float [11];
    arr_size = 10;
    for(int j=0;j<=arr_size;j++)
        coeff[j] = 10;
    cout << "Object created using default constructor..." << endl;
}

 poly(poly &p){
    arr_size = p.arr_size;
    coeff = new float[arr_size+1];
    for(int j=0;j<=arr_size;j++)
        coeff[j] = p.coeff[j];
    cout << "Copy constructor called......"<<endl;
}

~poly(){
    if(coeff){
        delete [] coeff;
        coeff = NULL;
        cout << "Destructor Msg:: Allocation free!!" << endl;
    }
}

void show();
void setCoeff();
poly operator+ (poly);};
 /*Show all coefficiens of a ploynomial*/
 void poly :: show(){
 for(int j=0; j<=arr_size; j++)
    cout << "coeff[" << j <<"]:\t"<< coeff[j]<< endl;
}



   /*To set a specific coefficient in the polynomial*/
 void poly :: setCoeff(){
 int i;
 again: cout << "Enter degree of coefficient you want to set: ";
 cin >> i;
 if(i>arr_size || i<0){
     cout << "!! Enter appropriate value." << endl;
    goto again;
}
cout << "Enter new value: ";
cin >> coeff[i];
}

poly poly :: operator+ (poly p){
poly temp;
for(int i=0;i<=arr_size;i++)
    temp.coeff[i] = coeff[i] + p.coeff[i];
    return temp; //I think Problem in this line 
 } 





int main(){
    cout << "***********  WELCOME  ***********" << endl;
    poly p[3];
    p[2] = p[0] + p[1];
    p[2].show();
    cout << "Thank You!!!" << endl;
    return 0;
}

1 ответ

Решение

Вы не определили оператор присваивания, поэтому, когда вы делаете p[2] = p[0] + p[1]используется оператор присваивания по умолчанию, который присваивает p[2].coeff указать на тот же массив, что и coeff временного объекта, созданного дополнением.

Поэтому, когда временный объект уничтожается, его деструктор удаляет массив и p[2].coeff теперь неверный указатель. Поэтому доступ к нему приведет к неопределенному поведению.

Также конструктор копирования должен взять const ссылка в качестве аргумента.

Что делать, если использовать "bool temp" в классе poly?

poly poly :: operator+ (poly p){
poly* buffer = new poly();
buffer->temp = true;
for(int i=0;i<=arr_size;i++)
    temp.coeff[i] = coeff[i] + p.coeff[i];
if (p.temp == true)
    delete &p;
return buffer;
} 
Другие вопросы по тегам