Colin_LH 2019-05-27 20:33 采纳率: 100%
浏览 437
已采纳

为什么执行析构函数释放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);
};******
  • 写回答

1条回答 默认 最新

  • Eleven 2019-05-28 10:07
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 7月28日

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)