c++ random cout statement causes program to crash inside overloaded '=' operator -
i had turn program in homework , it's been graded, got 80. i'm going , cleaning of code. @ bottom of code function overload = operator. reason, cout statement i've commented out, causes program crash, however, when remove //s program runs fine...
anyone have ideas why be?
#include <iostream> using namespace std; class poly { private: int order; //order of polynomial int * coeff;//pointer array of coeff on heap public: poly(); poly(int order); poly(int order, int * coeff); ~poly(){/*cout << "deconstructor\n";*/}; poly(const poly &rhs); //accessors & mutators void set(); void set(int * coeff, int order); void print2(); void ptrreset(); int getorder(){return order;}; int * get()const{return coeff;}; //overloaded operators poly operator+(const poly &rhs); poly operator-(const poly &rhs); poly operator*(const int scale); poly operator=(const poly &rhs); poly operator*(const poly &rhs); const int& operator[](int i)const; int& operator[](int i); bool operator==(const poly &rhs); int operator( )(int x); friend ostream & operator<<(ostream & out, const poly &rhs); friend istream & operator >>(istream & in, poly &rhs); }; int main() { int coeff1[ ] = {-19,1,-12,3,1}; int coeff2[ ] = {-19,1,-6,0,0,7,0,-1}; bool flag; poly p1(4, coeff1); poly p2(7, coeff2); poly p3; p3 = p1 + p2; cout << "p1 + p2: " << p3; p3 = p2 - p1; cout << "p2 - p1: " << p3; p3 = p1 * 10; cout << "p1 * 10: " << p3; p3 = p1 * p2; cout << "p1 * p2: " << p3; flag = (p2 == p2); cout << "p2 , p2 "; if (flag) cout << "equal\n"; else cout << "not equal\n"; flag = (p1 == p2); cout << "p1 , p2 "; if (flag) cout << "equal\n"; else cout << "not equal\n"; cout << "p1(4) = " << p1(4) << endl; cout << "p1: "; cout << p1; cout << "p2: "; cout << p2; p1[3] = p2[5]; cout << "p1(after p1[3] = p2[5]): " << p1; p1[3] = p2[4]; cout << "p1(after p1[3] = p2[4]): " << p1; return 0; } poly::poly() { coeff = (int *) malloc(sizeof(int)); order = 0; *coeff = 0; //cout << "default constructor\n"; } poly::poly(int order) { order = order; coeff = new int[order+1]; for(int i(0); <= order; i++) coeff[i] = 0; } poly::poly(int order, int * coeff) { order = order; coeff = coeff; } poly::poly(const poly &rhs) { order = rhs.order; int *temp; temp = (int *) malloc((rhs.order + 1) * sizeof(int)); coeff = (int *) malloc((order + 1) * sizeof(int)); temp = rhs.coeff; for(int i(0); <= order; i++) { *coeff = *temp; coeff++; temp++; } ptrreset(); } void poly::set() { coeff = (int *) malloc((order + 1) * sizeof(int)); if(coeff == null) { cout << "error allocating memory!\n"; exit(1); } cout << "begin entering non x value, x^1 coefficient, x^2, etc:\n"; for(int i(0); <= order; i++) { cout << (i+1) << ". "; cin >> * coeff; coeff++; } ptrreset(); } void poly::set(int * coeff, int order) { order = order; for(int i(0); <= order; i++) { *coeff = *coeff; coeff++; coeff++; } ptrreset(); } void poly::print2() { for(int i(0); <= order; i++) { cout << * coeff << " "; coeff++; } cout << endl; ptrreset(); } void poly::ptrreset() { for(int i(0); <= order; i++) coeff--; } poly poly::operator+(const poly &rhs) { int neworder; int * newpointer; int * temp; temp = rhs.coeff; if(order >= rhs.order) { neworder = order; newpointer = (int *) malloc((neworder+1) * sizeof(int)); for(int i(0); <= rhs.order; i++) { *newpointer = *coeff + *temp; newpointer++; coeff++; temp++; } for(int i(0); < (order - rhs.order); i++) { *newpointer = *coeff; newpointer++; coeff++; } } else { neworder = rhs.order; newpointer = (int *) malloc((neworder+1) * sizeof(int)); for(int i(0); <= order; i++) { *newpointer = *coeff + *temp; newpointer++; coeff++; temp++; } for(int i(0); < (rhs.order - order); i++) { *newpointer = *temp; newpointer++; temp++; } } ptrreset(); for(int i(0); <= neworder; i++) newpointer--; return poly(neworder, newpointer); } poly poly::operator-(const poly &rhs) { int neworder; int * newpointer; int * temp; temp = rhs.coeff; if(order >= rhs.order) { neworder = order; newpointer = (int *) malloc((neworder+1) * sizeof(int)); for(int i(0); <= rhs.order; i++) { *newpointer = *coeff - *temp; newpointer++; coeff++; temp++; } for(int i(0); < (order - rhs.order); i++) { *newpointer = *coeff; newpointer++; coeff++; } } else { neworder = rhs.order; newpointer = (int *) malloc((neworder+1) * sizeof(int)); for(int i(0); <= order; i++) { *newpointer = *coeff - *temp; newpointer++; coeff++; temp++; } for(int i(0); < (rhs.order - order); i++) { *newpointer = 0 - *temp; newpointer++; temp++; } } ptrreset(); for(int i(0); <= neworder; i++) newpointer--; return poly(neworder, newpointer); } poly poly::operator*(const int scale) { int neworder = order; int * temp = new int[order+1]; for(int i(0); <= order; i++) temp[i] = scale * coeff[i]; return poly(neworder, temp); } poly poly::operator*(const poly &rhs) { int neworder = order + rhs.order; int * newcoeff; int * temp; temp = rhs.coeff; newcoeff = (int *) malloc((neworder + 1) * sizeof(int)); for(int i(0); <= neworder; i++) { *newcoeff = 0; newcoeff++; } for(int i(0); <= neworder; i++) newcoeff--; for(int i(0); <= order; i++) { for(int j(0); j <= rhs.order; j++) { *newcoeff += (*coeff * *temp); newcoeff++; temp++; } coeff++; for(int j(0); j < rhs.order; j++) newcoeff--; for(int j(0); j <= rhs.order; j++) temp--; } for(int i(0); <= (neworder - rhs.order); i++) newcoeff--; ptrreset(); return poly(neworder, newcoeff); } bool poly::operator==(const poly &rhs) { bool test = true; int count = 0; while(test && (count <= order)) { if(order != rhs.order) test = false; else if(coeff[count] != rhs.coeff[count]) test = false; count++; } return test; } int poly::operator()(int x) { int * temp; int * temp2; temp = (int *) malloc((order + 1) * sizeof(int)); temp2 = temp; for(int i(0); < order; i++) coeff++; for(int i(0); <= order; i++) { *temp = *coeff; temp++; coeff--; } coeff++; for(int i(0); < order; i++) temp--; for(int i(0); < order; i++) { *temp += (x * *temp2); temp++; *temp2++; } return *temp2; } ostream &operator <<(ostream& out, const poly &source) { for(int i(source.order); >= 0; i--) { if(i == 1) { if(i == source.order) if(source.coeff[i] == 1) out << "x"; else if(source.coeff[i] == -1) out << "-x"; else out << source.coeff[i] << "x"; else if(source.coeff[i] == 1) out << " + " << "x"; else if(source.coeff[i] == -1) out << " - " << "x"; else if(source.coeff[i] > 0) out << " + " << source.coeff[i] << "x"; else if(source.coeff[i] < 0) out << " - " << abs(source.coeff[i]) << "x"; } else if(i > 1) { if(i == source.order) if(source.coeff[i] == 1) out << "x^" << i; else if(source.coeff[i] == -1) out << "-x^" << i; else out << source.coeff[i] << "x^" << i; else if(source.coeff[i] == 1) out << " + " << "x^" << i; else if(source.coeff[i] == -1) out << " - " << "x^" << i; else if(source.coeff[i] > 1) out << " + " << source.coeff[i] << "x^" << i; else if(source.coeff[i] < -1) out << " - " << abs(source.coeff[i]) << "x^" << i; } else { if(source.coeff[i] > 0) out << " + " << source.coeff[i]; else if(source.coeff[i] < 0) out << " - " << abs(source.coeff[i]); } } out << endl; return out; } int& poly::operator[](int i) { if(i > (order + 1) || < 0) { cout << "request access outside poly boundaries!" << endl; exit(1); } return coeff[i]; } const int& poly::operator[](int i) const { if(i > (order + 1) || < 0) { cout << "request access outside poly boundaries!" << endl; exit(1); } return coeff[i]; } poly poly::operator=(const poly &rhs) { order = rhs.order; //cout << "new order = " << rhs.order << endl; ******here******* for(int i(0); <= rhs.order; i++) coeff[i] = rhs.coeff[i]; return poly(order, coeff); }
when see this, usual problem behind double free/delete. you're calling free on same pointer twice (or invalid pointer) causes weird , crash can pretty happen @ time.
this can happen when mix malloc , new. switch new , see if still crash.
Comments
Post a Comment