注册 登录
编程论坛 C++教室

[求助]动态数组内存错误

weishj 发布于 2007-06-13 11:07, 638 次点击
大家好,小弟这几天比较晕,用动态数组编了个有关多项式计算的程序,编译时没错,但运行时老出现内存错误.希望高手们帮看下呀,在此先谢谢大家了
下面是源程序:为了方便调试,附件里传了那个程序的三个源文件.
只有本站会员才能查看附件,请 登录

///////////C12_6.h/////////
//////////类的接口文件////
#ifndef __C12_6__
#define __C12_6__
#include <iostream>
using namespace std;
namespace wei
{
class Polynomial
{
public:
Polynomial();
Polynomial(int n);//n为最高幂指数
~Polynomial();
int size();// 返回项数
void resize(int n);//重新设定数组大小
void set(double*,int);//为数组填入数据
friend ostream& operator<<(ostream& outs,Polynomial& p);
friend Polynomial& operator +(Polynomial& P1,Polynomial& p2);
friend Polynomial& operator +(const double m, Polynomial p2);
friend Polynomial& operator +( Polynomial P1,const double m);
friend Polynomial& operator -(Polynomial& P1,Polynomial& p2);
friend Polynomial& operator -(const double m, Polynomial p2);
friend Polynomial& operator -( Polynomial P1,const double m);
friend Polynomial& operator *(Polynomial& P1,Polynomial& p2);
friend Polynomial& operator *(const double m, Polynomial p2);
friend Polynomial& operator *( Polynomial P1,const double m);
void operator =(Polynomial p1);
private:
double* data;//存放系数 次数从0到n
int n;//记录数据数量(即项数)
};
}
#endif
///////////////////C12_6.cpp////////////
///////////////////类的实现/////////////
#include <iostream>
#include "c12_6.h"
using namespace std;
namespace wei
{
Polynomial::Polynomial()
{
n=50;
data=new double[n];
}
Polynomial::Polynomial(int n)//n为最高幂指数
{
this->n=n+1;
data=new double[n];
}
Polynomial::~Polynomial()
{
delete []data;
}
int Polynomial:: size()
{
return n;
}// 返回项数
void Polynomial::resize(int m)
{
n=m;
data=new double[n];
}
void Polynomial::set(double* m,int sz)
{
n=sz;
data=new double[n];
for(int i=0;i<sz;i++)
data[i]=m[i];
}
Polynomial& operator +(Polynomial& P1,Polynomial& p2)
{
Polynomial temp;
temp=(P1.size()>=p2.size())?P1:p2;
if(P1.size()>=p2.size())
for(int i=0;i<p2.size();i++)
temp.data[i]=P1.data[i]+p2.data[i];
else
for(int i=0;i<P1.size();i++)
temp.data[i]=P1.data[i]+p2.data[i];
return temp;
}
Polynomial& operator +(const double m, Polynomial p2)
{
p2.data[0]+=m;
return p2;
}
Polynomial& operator +( Polynomial P1,const double m)
{
P1.data[0]+=m;
return P1;
}
Polynomial& operator -(Polynomial& P1,Polynomial& p2)//p1-p2
{
Polynomial temp;
if(P1.size()>=p2.size())//p1项数多
{
temp=P1;
for(int i=0;i<p2.size();i++)
temp.data[i]-=p2.data[i];
}
else//p2项数多
{
temp=p2;
for(int i=0;i<temp.size();i++)
temp.data[i]=-temp.data[i];
for(int j=0;j<P1.size();j++)
temp.data[j]+=p2.data[j];
}
return temp;
}
Polynomial& operator -(const double m, Polynomial p2)
{
for(int i=0;i<p2.size();i++)
p2.data[i]=-p2.data[i];
p2.data[0]+=m;
return p2;
}
Polynomial& operator -( Polynomial P1,const double m)
{
P1.data[0]-=m;
return P1;
}
Polynomial& operator *(Polynomial& P1,Polynomial& p2)
{
Polynomial temp;
temp.resize(P1.size()+p2.size());
int i,j,k;
int s=P1.size()+p2.size();
for(i=0;i<s;i++)
temp.data[i]=0.0;
for(i=0;i<s;i++)
for(j=0;j<p2.size();j++)
for(k=0;k<P1.size();k++)
{
if((j+k)==i)
temp.data[i]+=p2.data[j]*P1.data[k];
}
return temp;
}
Polynomial& operator *(const double m, Polynomial p2)
{
for(int i=0;i<p2.size();i++)
p2.data[i]*=m;
return p2;
}
Polynomial& operator *( Polynomial P1,const double m)
{
for(int i=0;i<P1.size();i++)
P1.data[i]*=m;
return P1;
}
void Polynomial::operator =(Polynomial p1)
{
n=p1.size();
data=new double[n];
for(int i=0;i<n;i++)
data[i]=p1.data[i];
}
ostream& operator<<(ostream& outs,Polynomial& p)
{
for(int i=0;i<p.size();i++)
{
if(p.data[i]!=0.0)
{
outs<<p.data[i];
for(int j=0;j<i;j++)
outs<<"*x";
if(i<p.size()-1 && p.data[i]>0.0)
outs<<" + ";
}
}
outs<<endl;
return outs;
}
}
/////////////////////////测试程序/////////////////
/////////////////////////main.cpp/////////////////
#include <iostream>
#include "C12_6.h"
using namespace std;
using namespace wei;
void main()
{
Polynomial p1(3),p2(2),p3(5);
//暂时记p1为三次多项式,p2为二次
double* temp=new double[p1.size()];
double* b=new double[p2.size()];
cout<<"按升幂依次输入第一个多项式系数:"<<endl;
for(int i=0;i<p1.size();i++)
cin>>temp[i];
p1.set(temp,p1.size());
cout<<"按升幂依次输入第二个多项式系数:"<<endl;
for(int j=0;j<p2.size();j++)
cin>>b[j];
p2.set(b,p2.size());
cout<<"你输入的第一个多项式是: ";
cout<<p1<<"你输入的第二个多项式是: "<<p2;
// cout<<p1-p2<<endl;
// cout<<p1+p2<<endl;
// cout<<p1*p2<<endl;
// cout<<p1+3.0<<endl;
// cout<<p1-3.0<<endl;
// cout<<3.0-p1<<endl;
// cout<<3.0*p1<<endl;
// cout<<p1*3.0<<endl;
// cout<<3.0+p1<<endl;
delete []temp;
delete []b;
}

[此贴子已经被作者于2007-6-13 12:25:05编辑过]

2 回复
#2
wfpb2007-06-13 12:55

最好加上+=,-=这两个运算符,就更完善些。。。

class Polynomial
{
    double* data;//存放系数   次数从0到n
    int n;//记录数据数量(即项数)


public:
    Polynomial()
    {
        n=50;
        data=new double[n];
    }
    Polynomial(int num)//n为最高幂指数
    {
        this->n=num;
        data=new double[n];
    }
    Polynomial(const Polynomial& p)
    {
        n=p.n;
        data=new double[n];
        copy(p.data,p.data+n,data);
    }
    Polynomial& operator =(Polynomial p)
    {
        resize(p.size());
        for(int i=0;i<p.size();i++)
            data[i]=p.data[i];
        return *this;
    }
    ~Polynomial()
    {
        delete []data;
    }
    int size()
    {
        return n;
    }// 返回项数
    void resize(int m)
    {
        n=m;
        delete []data;
        data=new double[n];
    }
    void set(double* m,int sz)
    {
        resize(sz);
        for(int i=0;i<sz;i++)
            data[i]=m[i];
    }
    Polynomial operator -()
    {
        Polynomial temp(*this);
        for(int i=0;i<size();i++)
        {
            temp.data[i]*=-1;
        }
        return temp;
    }
    Polynomial operator +(Polynomial& p)
    {
        Polynomial temp;
        temp=(size()>=p.size())?(*this):p;
        if(size()>=p.size())
            for(int i=0;i<p.size();i++)
                temp.data[i]=data[i]+p.data[i];
        else
            for(int i=0;i<size();i++)
                temp.data[i]=data[i]+p.data[i];
        return temp;
    }
    friend Polynomial operator +(const double m, Polynomial p)
    {
        Polynomial temp=p;
        temp.data[0]+=m;
        return temp;
    }
    Polynomial operator +(const double m)
    {
        Polynomial temp=*this;
        temp.data[0]+=m;
        return temp;
    }
    Polynomial operator -(Polynomial& p)
    {
        Polynomial temp;
        if(size()>=p.size())//p1项数多
        {
            temp=*this;
            for(int i=0;i<p.size();i++)
                temp.data[i]-=p.data[i];
        }
        else//p2项数多
        {
            temp=p;
            for(int i=0;i<temp.size();i++)
                temp.data[i]=-temp.data[i];
            for(int j=0;j<size();j++)
                temp.data[j]+=p.data[j];
        }
        return temp;
    }
    friend Polynomial operator -(const double m, Polynomial p)
    {
        Polynomial temp=p;
        temp.data[0]-=m;
        return -temp;
    }
    Polynomial operator -(const double m)
    {
        Polynomial temp=*this;
        temp.data[0]-=m;
        return temp;
    }
    Polynomial operator *(Polynomial& p)
    {
        Polynomial temp;
        temp.resize(size()+p.size());
        int i,j,k;
        int s=size()+p.size();
        for(i=0;i<s;i++)
            temp.data[i]=0.0;
        for(i=0;i<s;i++)
            for(j=0;j<p.size();j++)
                for(k=0;k<size();k++)
                {
                    if((j+k)==i)
                        temp.data[i]+=p.data[j]*data[k];
                }
        return temp;
    }
    friend Polynomial operator *(const double m, Polynomial p2)
    {
        for(int i=0;i<p2.size();i++)
            p2.data[i]*=m;
        return p2;
    }
    Polynomial operator *(const double m)
    {
        Polynomial temp(*this);
        for(int i=0;i<size();i++)
            temp.data[i]*=m;
        return temp;
    }
    friend istream& operator>>(istream& ins,Polynomial& p)
    {
        printf(\"输入%d项式(按升幂依次输入多项式系数,例如:1+2x+3x*x*x,需要输入1 2 0 3):\n\",p.size());
        for(int i=0;i<p.size();i++)
        {
            ins>>p.data[i];
        }
        ins.clear();
        ins.sync();
        cout<<\"输入完毕\"<<endl;
        return ins;
    }
    friend ostream& operator<<(ostream& outs,Polynomial& p)
    {
        for(int i=0;i<p.size();i++)
        {
            if(p.data[i]!=0.0)
            {
                outs<<p.data[i];
                for(int j=0;j<i;j++)
                    outs<<\"*x\";
                if(i<p.size()-1 && p.data[i+1]>0.0)
                    outs<<\" + \";
            }
        }
        return outs;
    }
};


void Test()
{
    Polynomial p1(3),p2(2),p3(5);
    cin>>p1;
    cin>>p2;
    cout<<p1<<endl;
    cout<<p2<<endl;
    cout<<\"(\"<<p1<<\")\"<<\"-(\"<<p2<<\")=\"<<p1-p2<<endl;
    cout<<\"(\"<<p1<<\")\"<<\"+(\"<<p2<<\")=\"<<p1+p2<<endl;
    cout<<\"(\"<<p1<<\")\"<<\"*(\"<<p2<<\")=\"<<p1*p2<<endl;
    cout<<\"(\"<<p1<<\")\"<<\"+(\"<<3.0<<\")=\"<<p1+3.0<<endl;
    cout<<\"(\"<<p1<<\")\"<<\"-(\"<<3.0<<\")=\"<<p1-3.0<<endl;
    cout<<\"(\"<<3.0<<\")\"<<\"-(\"<<p1<<\")=\"<<3.0-p1<<endl;
    cout<<\"(\"<<3.0<<\")\"<<\"*(\"<<p1<<\")=\"<<3.0*p1<<endl;
    cout<<\"(\"<<p1<<\")\"<<\"*(\"<<3.0<<\")=\"<<p1*3.0<<endl;
    cout<<\"(\"<<3.0<<\")\"<<\"+(\"<<p1<<\")=\"<<3.0+p1<<endl;
}

[此贴子已经被作者于2007-6-13 12:58:54编辑过]

#3
weishj2007-06-13 15:40
非常感谢楼上的校友大哥
另外我想说一下,在VC6.0下,友元函数要想成功访问私有成员,只要把类和类的实现部分都放在一个名空间里即可,要不编译会出现内部错误.这样的话即可以正常使用像<string>这样的类,又可正常使用友元.小弟不才,这两天才发现这一点.
1