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

Popular posts from this blog

basic authentication with http post params android -

vb.net - Virtual Keyboard commands -

android - Inheriting from Theme.AppCompat* -