c++ - Seg fault when deallocating memory in destructor -


this question has answer here:

i have 2 simple classes. fine, when have empty destructor in class (empty ~a(){};). when add there lines free array, program gives me segmentation fault.

#include <iostream> #include <cstdlib> #include <ctime> using namespace std;  class {     private :          int n;         int m;         int **array;      public :          a();         a(int nn, int mm);         a(const a& a);         a& operator=(a a);         int getat(int i, int j);         int getn(){return n;}         int getm(){return m;}         ~a(); };  a::a() {     n = 0;     m = 0;     array = null; }  a::a(int nn, int mm) {     n = nn;     m = mm;      array = new int*[n];     for(int = 0; <n; i++)         array[i] = new int[m];      for(int i=0; i<n; i++)         for(int j=0; j<m; j++)             array[i][j] = rand()%2; }  a::a(const a& a) {     for(int i=0; <n; i++)         delete[] array[i];     delete [] array;     array = null;      n = a.n;     m = a.m;      array = new int*[n];     for(int = 0; <n; i++)         array[i] = new int[m];      for(int i=0; i<n; i++)         for(int j=0; j<m; j++)             array[i][j] = a.array[i][j]; }  a& a::operator=(a a) {     for(int i=0; <n; i++)         delete[] array[i];     delete [] array;     array = null;      n = a.n;     m = a.m;      array = new int*[n];     for(int = 0; <n; i++)         array[i] = new int[m];      for(int i=0; i<n; i++)         for(int j=0; j<m; j++)             array[i][j] = a.array[i][j];      return *this; }  int a::getat(int i, int j) {     return array[i][j]; }  a::~a() {     for(int i=0; <n; i++)         delete[] array[i];     delete [] array;     array = null; }  class b {     private :              a;      public :              b(){}             b(a aa);             void seta(a aa);             void showa(); };  b::b(a aa) {     = aa; }  void b::seta(a aa) {     = aa; }  void b::showa() {     int n = a.getn();     int m = a.getm();      for(int i=0; i<n; i++){         for(int j=0; j<m; j++)             cout << a.getat(i,j) << " ";         cout << "\n";     }     cout << "\n"; }  int main() {     a(3, 4);     b b(a);      b.showa();      return 0; } 

how fix this? , why did occur?

solved:

#include <iostream> #include <cstdlib> #include <ctime> using namespace std;  class {     private :          int n;         int m;         int **array;      public :          a();         a(int nn, int mm);         a(const a& a);         a& operator=(const a& a);         int getat(int i, int j);         int getn(){return n;}         int getm(){return m;}         ~a(); };  a::a() {     n = 0;     m = 0;     array = null; }  a::a(int nn, int mm) {     n = nn;     m = mm;      array = new int*[n];     for(int = 0; <n; i++)         array[i] = new int[m];      for(int i=0; i<n; i++)         for(int j=0; j<m; j++)             array[i][j] = rand()%2; }  a::a(const a& a) {     n = a.n;     m = a.m;      array = new int*[n];     for(int = 0; <n; i++)         array[i] = new int[m];      for(int i=0; i<n; i++)         for(int j=0; j<m; j++)             array[i][j] = a.array[i][j]; }  a& a::operator=(const a& a) {     for(int i=0; <n; i++)         delete[] array[i];     delete [] array;     array = null;      n = a.n;     m = a.m;      array = new int*[n];     for(int = 0; <n; i++)         array[i] = new int[m];      for(int i=0; i<n; i++)         for(int j=0; j<m; j++)             array[i][j] = a.array[i][j];      return *this; }  int a::getat(int i, int j) {     return array[i][j]; }  a::~a() {     for(int i=0; <n; i++)         delete[] array[i];     delete [] array;     array = null; }  class b {     private :              a;      public :              b(){}             b(a aa);             void seta(a aa);             void showa(); };  b::b(a aa) {     = aa; }  void b::seta(a aa) {     = aa; }  void b::showa() {     int n = a.getn();     int m = a.getm();      for(int i=0; i<n; i++){         for(int j=0; j<m; j++)             cout << a.getat(i,j) << " ";         cout << "\n";     }     cout << "\n"; }  int main() {     a(3, 4);     b b(a);      b.showa();      return 0; } 

your copy constructor first overwrites old n new n, attempts delete n elements of old array. if arrays of different sizes? overwrite n after loop.

or, better still, rid of horrid pointer monstrosity , use std::vector instead.


Comments

Popular posts from this blog

c# - Operator '==' incompatible with operand types 'Guid' and 'Guid' using DynamicExpression.ParseLambda<T, bool> -