destruktor usuwa zmienna przed przekazaniem wartosci
Ostatnio zmodyfikowano 2014-03-13 18:31
arknaw Temat założony przez niniejszego użytkownika |
destruktor usuwa zmienna przed przekazaniem wartosci » 2014-03-13 18:03:20 Witam, jestem bardzo początkującym programista w C/C++. Mam problem z programem który napisałem: #ifndef _naglowki_h #define _naglowki_h #include <stdio.h> #include <iostream> #include <math.h> using namespace std;
class cMatrix { int n, m; double ** T; public: cMatrix(); cMatrix( int n, int m ); cMatrix( const cMatrix & X ); ~cMatrix(); void Przydziel( int _n, int _m ); void Zwolnij(); friend ostream & operator <<( ostream & str, const cMatrix & X ); friend istream & operator >>( istream & str, cMatrix & X ); void ones(); cMatrix & operator =( const cMatrix & X ); cMatrix operator *( const cMatrix & X ); };
#endif i main.cpp: #include "naglowki.h" cMatrix cMatrix::operator *( const cMatrix & X ) { cMatrix temp( this->n, this->m ); if( this->m == X.n ) { for( int j = 0; j < this->n; j++ ) for( int k = 0; k < X.m; k++ ) { float u = 0; for( int l = 0; l < this->m; l++ ) u += this->T[ j ][ l ] * X.T[ l ][ k ]; temp.T[ j ][ k ] = u; } } return temp; }
cMatrix & cMatrix::operator =( const cMatrix & X ) { n = X.n; m = X.m; T = X.T; return * this; }
cMatrix::~cMatrix() { if( T != NULL ) Zwolnij(); }
void cMatrix::Zwolnij() { for( int i = 0; i < this->n; i++ ) delete[] T[ i ]; delete T; n = 0; m = 0; } cMatrix::cMatrix( const cMatrix & X ) { n = X.n; m = X.m; T = X.T; }
void cMatrix::Przydziel( int _n, int _m ) { if( T != NULL ) Zwolnij(); T = new double *[ _n ]; for( int i = 0; i < _n; i++ ) T[ i ] = new double[ _m ]; n = _n; m = _m; for( int j = 0; j < _n; j++ ) for( int k = 0; k < _m; k++ ) T[ j ][ k ] = 0; }
cMatrix::cMatrix( int N, int M ) { n = 0; m = 0; T = NULL; Przydziel( N, M ); }
cMatrix::cMatrix() { n = 0; m = 0; T = NULL; }
int main() { cMatrix A, B( 3, 3 ), C; cin >> A; cout << "macierz A:" << endl << A; B.ones(); cout << "macierz B:" << endl << B; C = A * B; cout << "C=A*B:" << endl << C; system( "pause" ); return 0; } i pojawia się problem: "Access violation reading location". po przejrzeniu programu widze że wywala się przy C=A*B. Destruktor usuwa zmienną "temp" z funkcji: cMatrix cMatrix::operator *( const cMatrix & X ) zanim "zdąży" ona przekazać wartość do funkcji main. Gdy nie ma destruktora wszystko jest ok. Jak rozwiązać problem? Z góry dzięki za pomoc. |
|
Monika90 |
» 2014-03-13 18:18:33 Operator przypisania i konstruktor kopiujacy są błędne. (jak zwykle zresztą) |
|
arknaw Temat założony przez niniejszego użytkownika |
» 2014-03-13 18:23:50 A mogłabyś napisać/wyjaśnić jak to powinno wyglądać. O dziwo wszystko jest ok do momentu jak uruchamia się destruktor. |
|
Monika90 |
» 2014-03-13 18:31:30 Konstruktor kopiujacy musi utworzyć kopie swojego argumentu. Tzn. musi przydzielić pamieć na tablicę i skopiować jej zawartość. Podobnie operator przypisania, który na dodatek musi zwolnić dotychczasową tablicę (tutaj najlepiej użyć idiomu copy-and-swap).
A w ogóle jakbyś użył std::vector to by kompilator zrobił to wszystko za ciebie. |
|
« 1 » |