为什么我的代码在使用 cout<<num0+num1 时遇到问题?



代码在main中存在问题。当我单独尝试cout<<num0-num1;cout<<num0+num1;时,它们工作得很好,但当我一起尝试时,代码只会停止打印其中一个,其余的代码也会停止。我的意思是:如果我把主写为:

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.

这是代码:Main:

#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;
}

馏分标题:

#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

分数.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函数中使用的局部数组应在函数末尾删除,然后再返回。否则数组将被泄漏。


Fraction tmp;
tmp.num = fract.num/maxN;
tmp.denom=fract.denom/maxN;
// free the arrays
delete[] arrN;
delete[] arrD;
delete[] arrC;
return tmp;
}

相关内容

最新更新