Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

błąd przy zwalnianiu pamięci C ++

gerlin 11 Kwi 2011 22:11 712 1
  • #1 11 Kwi 2011 22:11
    gerlin
    Poziom 8  

    witam
    mam problem w programie w C++. Program jest dość dużo, to wkleję tylko konkretne fragmenty. Efekt jest taki, że raz na 4-5 razy program przerywa działanie w miejscu zwalniania pamięci. Gdy pozostawiłem zwalnianie tylko jednej z macierzy (którejkolwiek) to błąd pozostał, gdy zwalnianie jest usunięte - jest ok. Liczba wierszy w alokacji jest równa liczbie wierszy przy zwalnianiu. Nazwy są troszkę różne, bo alokacja i zwalnianie są w różnych funkcjach. Alokacja:

    Code:
     
    
    mac.matrix = new int *[mac.l_wierszy_matrixa];                         
             for ( int i=0; i<mac.l_wierszy_matrixa; ++i )                       
             {                                                                           
            mac.matrix[i]=new int[mac.l_kolumn_matrixa];                                       
             }
         
             mac.matrix_p_tab_x = new int *[mac.l_wierszy_matrixa];
             mac.matrix_p_tab_f = new int *[mac.l_wierszy_matrixa];
             
             for ( int i=0; i<mac.l_wierszy_matrixa; ++i )                       
             {                                                                   
                 mac.matrix_p_tab_x[i] = new int [Object_p.l_kolumn_x];
                 mac.matrix_p_tab_f[i] = new int;                                         
             }
    i zwolnienie:
    Code:

     for (int i=0; i < maciora2.l_wierszy_matrixa; i++ )
         {
             delete [] maciora2.matrix [i];                                         
             delete [] maciora2.matrix_p_tab_x [i];
             delete [] maciora2.matrix_p_tab_f [i];   
         }
         delete [] maciora2.matrix;
         delete [] maciora2.matrix_p_tab_x;
         delete [] maciora2.matrix_p_tab_f;


    dlaczego tak jest? I czy muszę zwalniać pamięć na końcu programu, bo ona jest chyba automatycznie zwalniana po zakończeniu programu, czy nie ?

    0 1
  • #2 12 Kwi 2011 00:44
    szel
    Poziom 20  

    Usuwanie powinieneś ustawić w kolejności odwrotnej do alokacji. W alokacji są dwie pętle a w usuwaniu u Ciebie tylko jedna. Nazwy elementów usuwanych muszą się zgadzać z utworzonymi. Utworzone w pamięci elementy nie wszystkie są tablicami.

    Code:
    for (int i=0; i < maciora2.l_wierszy_matrixa; i++ )
    
         {
           delete [] maciora2.matrix_p_tab_x [i];
           delete    maciora2.matrix_p_tab_f [i];   
         }
        delete [] maciora2.matrix_p_tab_f ;
        delete [] maciora2.matrix_p_tab_x ;

       for ( int i=0; i<maciora2.l_wierszy_matrixa; ++i )         
            delete [] maciora2.matrix[i]; 
       delete [] maciora2.matrix;

    0