为什么执行析构函数释放temp2的p指针动态分配的空间时会报错?大佬们救救我

当我执行重载减法操作符时,我创建了一个局部对象temp2,又为temp2的p指针new了一个动态数组,我想在析构时应该会把该temp2的p指针new出来的空间释放,但是为什么会报错,难道我二次释放了吗?问题出在星号部分。大佬们帮我解决啊

#include "stdafx.h"
#include<iostream>
using namespace std;
class polynomial{
private:
    double sum,*p;
    int n;
    static int count;
public:
    polynomial();
    polynomial(const polynomial&a);
    ~polynomial();
    void getpolynomial(int time);
    void showcount()const{cout<<"多项式的个数为:"<<count<<endl;}
    void display()const;
    double compute();
  friend polynomial &operator+(const polynomial&b,const polynomial&c);
    polynomial &operator-(const polynomial&b);
    polynomial &operator*(const polynomial&d);
     polynomial&operator=(const polynomial&b);

};
int polynomial::count=0;
polynomial::polynomial():n(0),sum(0),p(0){
    count++;
}
polynomial::polynomial(const polynomial&a){
    n=a.n;
    sum=a.sum;
    p=new double[n];
    for(int i=0;i<=n;i++)
        p[i]=a.p[i];
    count++;
}

****polynomial::~polynomial(){
    delete[]p;
    count--;
//防止内存泄漏
}****


void polynomial::getpolynomial(int time){
    n=time;
    p=new double[n];//创建动态数组,可以存放任意大小的多项式
    for(int i=0;i<=n;i++){
        cout<<"输入第"<<i+1<<"项的系数:";
        cin>>p[i];}
}
void polynomial::display() const{
    for(int i=n;i>=0;i--){
        //判断多项式系数是否为0
        if(p[i]==0){
            cout<<"";
            continue;}

        //若多项式系数小于0
        if(p[i]<0){
        if(i==0)
           cout<<p[i];
        //若次数为1,则不用输出次数项
        else if(i==1){
            if(p[i]!=-1)
            cout<<p[i]<<"x";
            else
                cout<<"-x";
        }
        //若系数为-1,则只输出-号
         else if(p[i]==-1)
             cout<<"-x^"<<i;
        //其他情况则按照正常输出
        else
        cout<<p[i]<<"x^"<<i<<"";
      continue;
        }
      //若多项式系数大于0
      if(p[i]>0){
          if(i==0)
              cout<<"+"<<p[i];
          //若次数为1,则不用输出次数项
          else if(i==1){
              if(p[i]!=1)
            cout<<"+"<<p[i]<<"x";
              else
            cout<<"+x";
          }
              //若系数为1,则不输出1
          else if(p[i]==1)
              cout<<"+"<<"x^"<<i;
          else
        cout<<"+"<<p[i]<<"x^"<<i<<"";
    continue;
      }

    }
    cout<<endl;
}
double polynomial::compute(){
    double x;
    cout<<"\ninput the value of x:";//输入x的值进行计算
    cin>>x;
    if(x==0)
        throw exception();
    for(int i=0;i<=n;i++)
        sum+=p[i]*(pow(x,i));
        cout<<"The result is:"<<sum<<endl;

}

******polynomial& polynomial::operator-(const polynomial&b){
//因为每个多项式系数涉及的是一个固定大小数组,因此需要防止数组下标越界
    polynomial temp2;
    if(n<=b.n){
        temp2.n=b.n;
        temp2.p=new double[b.n];
        for(int i=0;i<=n;i++)
        temp2.p[i]=p[i]-b.p[i];
        for(int i=n+1;i<=b.n;i++)
            temp2.p[i]=-b.p[i];
    }
    if(n>b.n){
        temp2.n=n;
        temp2.p=new double[n];
        for(int i=0;i<=b.n;i++)
            temp2.p[i]=p[i]-b.p[i];
        for(int i=b.n+1;i<=n;i++)
            temp2.p[i]=p[i];
    }
    count--;
    return * new polynomial(temp2);
};******
c++

1个回答

一般的,构造函数中初始化指针为NULL,new的地方先判断,如果之前已经分配,先delete释放在new,析构函数中判断指针是否为NULL,如果不是NULL,再delete删除。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问