c++ - Seg fault when deallocating memory in destructor -
this question has answer here:
- what rule of three? 8 answers
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
Post a Comment