Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zwalnianie pamięci dla tablicy dwuwymiarowej

Ostatnio zmodyfikowano 2017-05-16 10:47
Autor Wiadomość
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:

C/C++
#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++ )
    {
        //cout << "\nCreate columns in row " << 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 ];
                //cout << c << ". i=" << i << " j=" << j << " k=" << k << endl;
                c++;
            }
            //cout << "przypisanie " << mulResult << " do j=" << j << " i i=" << i << endl;
            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;
}
P-161177
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.
P-161185
mrci
Temat założony przez niniejszego użytkownika
» 2017-05-16 10:47:59
Pomogło :) Wielki dzięki!
P-161187
« 1 »
  Strona 1 z 1