1
#include<iostream>
#include"polynom.h"
using namespace std;

// operator= works !!!

int main()
{
    Polynomial p(5), q(5), r(5);
    cout<<"1"<<endl;
    cin>>x;

    p[0] = 1;
    p[1] = 2;
    p[2] = 3;

    q[0] = 4;
    q[1] = 5;
    q[2] = 6;

    cout<<p+q;
    return 0;
}


Polynomial::Polynomial(const Polynomial &copyConstructor) : size(copyConstructor.size)
{ 
    coeffs = new double(size);

    int i=0;
    while(i<size)
    {
        coeffs[i] = copyConstructor.coeffs[i];
        i++;
    }
} 


Polynomial::Polynomial(int s)
{
    size = s;
    coeffs = new double [s];

    // Setting all coefficients in the polynomial equal to 0 
    for(int i=0; i<size; i++)
        coeffs[i]=0;
}



Polynomial Polynomial::operator+ (const Polynomial &rightPoly) const
{

    int BigSize, SmallSize;
    Polynomial *newPoly = NULL;

    cout<<"in the operator\n";

    if(size == rightPoly.size)
    {
        cout<<"first if\n";
        newPoly = new Polynomial(size);

        cout<<"first if resize\n";
        for(int i=0; i<newPoly->size; i++)
            cout<<newPoly->coeffs[i]<<endl;
        cout<<"size = "<<size<<endl;
        cout<<"rightPoly.size = "<<rightPoly.size<<endl;
        cout<<"newPoly->size = "<<newPoly->size<<endl;

        cout<<"first if loop\n";
        for(int i=0; i<size; i++)
        {
            cout<<"i= "<<i;
            newPoly->coeffs[i] = rightPoly.coeffs[i]+coeffs[i];
            cout<<" newPoly[]"<<newPoly->coeffs[i]<<endl;
        }
        cout<<"out of loop\n"<<endl;
    }


    else if(size > rightPoly.size)
    {
        cout<<"second if\n";
        BigSize = size;
        SmallSize = rightPoly.size;

        newPoly = new Polynomial(BigSize);

        cout<<"second if loop\n";
        for(int i=0; i<SmallSize; i++)
            newPoly->coeffs[i] = rightPoly.coeffs[i] + coeffs[i];
        for(int i=SmallSize; i<BigSize; i++)
            newPoly->coeffs[i] = coeffs[i];
        cout<<"second if loop end\n";
    }

    else
    {
        cout<<"third if\n";
        BigSize = rightPoly.size;
        SmallSize = size;

        newPoly = new Polynomial(BigSize);

        for(int i=0; i<SmallSize; i++)
            newPoly->coeffs[i] = coeffs[i] + rightPoly.coeffs[i];
        for(int i=SmallSize; i<BigSize; i++)
            newPoly->coeffs[i] = rightPoly.coeffs[i];
    }

    cout<<"before return\n";
    return *newPoly;    
}

問題: Visual Studio 2010 で p+q 行を実行すると、次のエラーが発生します。p と q は両方とも同じサイズで、適切に初期化されています (両方を確認しました)。

Windows has triggered a breakpoint in CNG242.exe.
This may be due to a corruption of the heap, which indicates a bug in CNG242.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while CNG242.exe has focus.
The output window may have more diagnostic information.

行をたどって問題の場所を見つけるために、コメントを追加しました。エラーの原因がわかりませんか?

4

2 に答える 2

2

表現

coeffs = new double(size);

は、 1 つの 変数にスペースを割り当てdouble、その値を に初期化しsize、ポインタを に戻しますcoeffs。おそらくあなたが望むのは:

coeffs = new double[size];

角かっこに注意してください。これは double のスペースをsize初期化し、特に何も初期化せず、最初のものへのポインターを に返しますcoeffs

于 2012-05-11T09:11:42.907 に答える
0

ヒープ ブロックをオーバーフローしました

coeffs = new double(size); // You allocated memory for only one double variable

こちらです。

于 2012-05-11T09:09:38.357 に答える