Zwalnianie pamięci dla tablicy dwuwymiarowej
Ostatnio zmodyfikowano 2017-05-16 10:47
mrci Temat założony przez niniejszego użytkownika |
Zwalnianie pamięci dla tablicy dwuwymiarowej » 2017-05-16 01:16:31 Witam, Mam problem przy zwalnianiu pamięci. Debuger pokazuje, że wykraczam poza zakres tablicy. Iterator pętli, nie powinien przekroczyć 2(w przypadku Arow) lub 3(w przypadku Brow), a mimo to osiąga 2 i wywala błąd <Unable to read memory>, co jest logiczne w tym przypadku, tylko nie wiem dlaczego iterator osiaga 2. Dzęki za wszelkie porady :) Program do mnożenia macierzy: #include <iostream> using namespace std;
double ** MatrixMul( double ** A, int Arow, int Acol, double ** B, int Brow, int Bcol ) { double ** result; result = new double *[ Arow ]; for( int i = 0; i < Arow; i++ ) { result[ i ] = new double[ Bcol ]; } int c = 1; for( int i = 0; i < Arow; i++ ) { for( int j = 0; j < Bcol; j++ ) { double mulResult = 0; for( int k = 0; k < Acol; k++ ) { mulResult += A[ i ][ k ] * B[ k ][ j ]; c++; } result[ i ][ j ] = mulResult; } } return result; }
void printMatrix( double ** M, int Mrow, int Mcol ) { for( int i = 0; i < Mrow; i++ ) { cout << "| "; for( int j = 0; j < Mcol; j++ ) { cout << M[ i ][ j ] << " "; } cout << "|\n"; } }
void initA( double ** A ) { A[ 0 ][ 0 ] = - 2; A[ 0 ][ 1 ] = - 3; A[ 0 ][ 2 ] = 1; A[ 1 ][ 0 ] = - 1; A[ 1 ][ 1 ] = 4; A[ 1 ][ 2 ] = 0; }
void initB( double ** B ) { B[ 0 ][ 0 ] = - 2; B[ 0 ][ 1 ] = - 1; B[ 0 ][ 2 ] = - 2; B[ 1 ][ 0 ] = 3; B[ 1 ][ 1 ] = 0; B[ 1 ][ 2 ] = 1; B[ 2 ][ 0 ] = 2; B[ 2 ][ 1 ] = 2; B[ 2 ][ 2 ] = - 1; }
void deleteMatrix( double ** M, int Mrow ) { for( int i = 0; i < Mrow; i++ ) { delete[] M[ i ]; } delete[] * M; }
int main() { int Arow = 2; int Acol = 3; double ** A; A = new double *[ Arow ]; for( int i = 0; i < Arow; i++ ) { A[ i ] = new double[ Acol ]; } int Brow = 3; int Bcol = 3; double ** B = new double *[ Brow ]; for( int i = 0; i < Brow; i++ ) { B[ i ] = new double[ Bcol ]; } initA( A ); initB( B ); printMatrix( A, Arow, Acol ); cout << endl << "*" << endl << endl; printMatrix( B, Brow, Bcol ); cout << endl << "=" << endl << endl; double ** C = MatrixMul( A, Arow, Acol, B, Brow, Bcol ); printMatrix( C, Arow, Bcol ); for( int i = 0; i < Arow; i++ ) { delete[] A[ i ]; } delete[] * A; for( int i = 0; i < Brow; i++ ) { delete[] B[ i ]; } delete[] * B; for( int i = 0; i < Arow; i++ ) { delete[] C[ i ]; } delete[] * C; }
|
|
Monika90 |
» 2017-05-16 10:30:53 delete[] *A znaczy to samo co delete[] A[0], czyli zwalniasz tablicę dwa razy. Ten sam błąd z B, C i M. |
|
mrci Temat założony przez niniejszego użytkownika |
» 2017-05-16 10:47:59 Pomogło :) Wielki dzięki! |
|
« 1 » |