【问题标题】:Destructor , Returning temp object析构函数,返回临时对象
【发布时间】:2015-12-14 19:59:25
【问题描述】:

我不明白返回临时对象有什么问题。如果我不使用析构函数,那么一切都很好。 但是使用析构函数会产生问题。多项式 1 和 2 的系数打印正确。多项式 3 也是。但是多项式 3 的 coeff[1] 和 coeff[2] 相加后没有给出正确的值。有人可以帮忙吗?

#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;
}

【问题讨论】:

  • 您的问题陈述是“没有给出正确的值”。这不是一个好的问题陈述。
  • 您只需阅读到float* coeff; 就可以猜出问题所在。使用std::vector&lt;float&gt; 可以解决它。

标签: c++ object destructor


【解决方案1】:

你没有定义赋值操作符,所以当你做p[2] = p[0] + p[1]的时候,使用的是默认赋值操作符,它把p[2].coeff赋值为和加法创建的临时对象的coeff指向同一个数组.

所以当临时对象被销毁时,它的析构函数会删除数组,p[2].coeff 现在是一个无效指针。因此访问它会导致未定义的行为。

此外,复制构造函数应将const 引用作为其参数。

【讨论】:

  • 那么解决办法是什么。
  • @user5347919 解决方案是定义赋值运算符和适当的复制构造函数(即在参数中添加const)。
【解决方案2】:

如果在 poly 类中使​​用“bool temp”会怎样?

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;
} 

【讨论】:

  • 我遇到了完全相同的问题。这个想法让我有帮助
猜你喜欢
  • 2016-10-10
  • 2014-11-29
  • 2015-12-05
  • 2015-12-14
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
相关资源
最近更新 更多