为什么我的代码在 cout<<num0+num1 方面有问题?

Why does my code have trouble with cout<<num0+num1?

main 中的代码有问题。当我单独尝试 cout<<num0-num1; 或单独尝试 cout<<num0+num1; 时,它们工作正常,但是当我一起尝试时,代码只是停止打印其中一个,其余代码停止。 我的意思是: 如果我把 main 写成:

    cout << "Hello world!" << endl;
    Fraction num0(90,150);
    Fraction num1(13,65);
    Fraction num2;
    cout<<num0;
    cout<<num1;
    cout<<num0-num1;
    cout<<num2;
    cout<<"idk whats wrong";

它工作正常并打印出来:

90/150
13/65
2/5
1/1
idk whats wrong
Process returned -1073741819 (0xC0000005)   execution time : 2.184
Press any key to continue.

但是,如果我把它写成

   cout << "Hello world!" << endl;
    Fraction num0(90,150);
    Fraction num1(13,65);
    Fraction num2;
    cout<<num0;
    cout<<num1;
    cout<<num0-num1;
    cout<<num2;
    cout<<num0+num1;
    cout<<"idk whats wrong";

它打印:

Hello world!
90/150
13/65
2/5

Process returned -1073741819 (0xC0000005)   execution time : 2.608 s
Press any key to continue.

代码如下: 主要:

#include <iostream>
using namespace std;
#import "Fraction.h"

int main()
{
    cout << "Hello world!" << endl;

    Fraction num0(90,150);
    Fraction num1(13,65);
    Fraction num2;
    cout<<num0;
    cout<<num1;
    cout<<num0-num1;
    cout<<num2;
    cout<<num0+num1;
    cout<<"idk whats wrong";

    return 0;
}

分数header:

#ifndef FRACTION_H
#define FRACTION_H
#include <iostream>
using namespace std;

class Fraction
{
public:
    Fraction(int num, int denom);
    Fraction();
    Fraction reducedFraction(Fraction fract);

    Fraction operator+(const Fraction &fraction);
    Fraction operator-(const Fraction &fraction);
    Fraction& operator= (const Fraction &fraction);
    Fraction operator/(const Fraction &fraction);
    Fraction operator*(const Fraction &fraction);

    bool operator<(const Fraction &fraction);
    bool operator>(const Fraction &fraction);
    bool operator<=(const Fraction &fraction);
    bool operator>=(const Fraction &fraction);
    bool operator==(const Fraction &fraction);

    friend ostream& operator<<(ostream& os, const Fraction& fraction);
    friend istream& operator>>(istream& is,  Fraction& fraction);

    void setNum(int num);
    int getNum();
    void setDenom(int denom);
    int getDenom();
    virtual ~Fraction();


private:
    int num;
    int denom;
    int* arrN;
    int* arrD ;
    int* arrC;
};

#endif // FRACTION_H

Fraction.cpp

#include "Fraction.h"
Fraction::Fraction()
{
    num=1;
    denom=1;
}
Fraction::Fraction(int num,int denom)
{
    this->num=num;
    this->denom = denom;
}
void Fraction::setNum(int num)
{
    this->num = num;
}
void Fraction::setDenom(int denom)
{
    this->denom = denom;
}
int Fraction::getDenom()
{
    return denom;
}
int Fraction::getNum()
{
    return num;
}
Fraction Fraction::operator+(const Fraction& fraction)
{
    Fraction tmp;
    tmp.num=(this->num*fraction.denom)+(fraction.num*this->denom);
    tmp.denom =this->denom*fraction.denom;
    return reducedFraction(tmp);

}
Fraction Fraction::operator-(const Fraction &fraction)
{
    Fraction tmp;
    tmp.num=(this->num*fraction.denom)-(fraction.num*this->denom);
    tmp.denom =this->denom*fraction.denom;
    return reducedFraction(tmp);

}
Fraction Fraction::operator*(const Fraction &fraction){
    Fraction tmp;
    tmp.num=this->num*fraction.num;
    tmp.denom=this->denom*fraction.denom;
    return reducedFraction(tmp);

}
Fraction Fraction::operator/(const Fraction &fraction){
    Fraction tmp;
    tmp.num=this->num*fraction.denom;
    tmp.denom=this->denom*fraction.num;
    return reducedFraction(tmp);

}
bool Fraction::operator==(const Fraction &fraction){
    if((this->num/this->denom)==(fraction.num/fraction.denom)){
            return true;
    }
    else {
        return false;
    }
}
bool Fraction::operator>(const Fraction &fraction){
    if((this->num/this->denom)>(fraction.num/fraction.denom)){
            return true;
    }
    else {
        return false;
    }
}
bool Fraction::operator<(const Fraction &fraction){
    if((this->num/this->denom)<(fraction.num/fraction.denom)){
            return true;
    }
    else {
        return false;
    }
}
bool Fraction::operator>=(const Fraction &fraction){
    if((this->num/this->denom)>=(fraction.num/fraction.denom)){
            return true;
    }
    else {
        return false;
    }
}
bool Fraction::operator<=(const Fraction &fraction){
    if((this->num/this->denom)<=(fraction.num/fraction.denom)){
            return true;
    }
    else {
        return false;
    }
}
Fraction& Fraction::operator= (const Fraction &fraction)
{
    this->num=fraction.num;
    this->denom = fraction.denom;
    return *this;

}
ostream& operator<<(ostream& os, const Fraction& fraction)
{
    os<<fraction.num<<"/"<<fraction.denom<<endl;
    return os;
}


Fraction Fraction::reducedFraction( Fraction fract)
{
    int* arrN = new int[fract.num];
    int* arrD = new int[fract.denom];
    int* arrC;
    int countN=0;
    int countD=0;
    for (int i = 2 ; i<=fract.num; i++)
    {
        if (fract.num%i==0)
        {
            arrN[countN]=i;
            countN++;
        }
    }
    for (int i = 2 ; i<=fract.denom; i++)
    {
        if (fract.denom%i==0)
        {
            arrD[countD]=i;
            countD++;
        }
    }
    if (countN>=countD)
    {
        arrC = new int[countN];
    }
    else
    {
        arrC = new int[countD];
    }
    int countC =0;

    for ( int i = 0 ; i <countN; i++)
    {
        for (int j=0; j<countD; j++)
        {
            if(arrN[i]==arrD[j])
            {
                arrC[countC]=arrN[i];
                countC++;

            }
        }
    }
    int maxN = arrC[0];
    for ( int i =1; i<countC; i++)
    {
        if (arrC[i]>maxN)
        {
            maxN=arrC[i];
        }

    }
    Fraction tmp;
    tmp.num = fract.num/maxN;
    tmp.denom=fract.denom/maxN;
    return tmp;

}

Fraction::~Fraction()
{
    delete[]arrC;
    delete[]arrN;
    delete[]arrD;

}

错误看起来是由释放未初始化指针的析构函数引起的。

除错误外未使用的成员变量

    int* arrN;
    int* arrD ;
    int* arrC;

和删除语句只是为了导致错误

    delete[]arrC;
    delete[]arrN;
    delete[]arrD;

应该删除。

之后,reducedFraction函数中使用的local数组应该在函数结束时删除,然后返回。否则数组将被泄露。


    Fraction tmp;
    tmp.num = fract.num/maxN;
    tmp.denom=fract.denom/maxN;

    // free the arrays
    delete[] arrN;
    delete[] arrD;
    delete[] arrC;

    return tmp;

}