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

[ANSI C] Czyszczenie tablicy wskaźnikowej

Ostatnio zmodyfikowano 2014-10-19 16:52
Autor Wiadomość
wiktor12348
Temat założony przez niniejszego użytkownika
[ANSI C] Czyszczenie tablicy wskaźnikowej
» 2014-10-19 12:57:23
Witam,

Tym razem postaram się opisać problem dokładniej. Moim zdaniem było napisanie programu w Ansi C (ważna sprawa).
Częścią zadania było alokacja dynamicznej tablicy a później alokacja dynamicznych struktur na tablice. Oczywiście na końcu mam ją zwolnić.

Jedna z funkcji ma stworzyć taką strukturę danych a później przez argument inne funkcje pobierają wskaźnik na nią i robią obliczenia, sortowania itp. Generalnie takich danych jest ponad 100 tys. i więcej.
C/C++
pierwsza ** tab =( pierwsza ** ) malloc( sizeof( pierwsza * ) * n );

By zwolnić dynamiczną tablice, tworzyło się pętle i leciało po wszystkich komórkach.
Mniej więcej:
C/C++
for( int i = 0; i < n; i++ )
     free( tab[ i ] );

free( tab );

Próbowałem tak zrobić w moim przypadku, mam błąd (jak się można domyślać przy zwolnieniu pamięci).

Jak poprawnie zwolnić pamięć?
P-118858
pekfos
» 2014-10-19 13:36:01
Jak poprawnie zwolnić pamięć?
Pytanie powinno brzmieć, jak poprawnie tą pamięć zaalokować ;) Zwalniasz n + 1 bloków, a malloc() wywołujesz raz..
P-118872
wiktor12348
Temat założony przez niniejszego użytkownika
» 2014-10-19 14:02:42
Puściłem śledzenie, wywala mi błąd przy pierwszym kółku:

SDiZOLAB1.exe has triggered a breakpoint.

Podaje też linijkę w dbgheap.c

Może trochę kodu:
C/C++
pierwsza ** Stworz( int d )
{
    pierwsza ** tab =( pierwsza ** ) malloc( sizeof( pierwsza * ) * d );
    for( int i = 0; i < d; i++ ) {
        pierwsza * add =( pierwsza * ) malloc( sizeof( pierwsza * ) );
        /*...*/
        tab[ i ] = add;
    }
    return tab;
}
int zlicz( pierwsza ** tab, int n, char z ) {
    /*....*/
}
void czysc( pierwsza ** tab, int n ) {
    for( int i = 0; i <( n - 1 ); i++ ) {
        free( tab[ i ] );
    }
    free( tab );
}
P-118882
pekfos
» 2014-10-19 14:09:25
C/C++
pierwsza * add =( pierwsza * ) malloc( sizeof( pierwsza * ) );
Alokujesz pamięć pod wskaźnik, a nie obiekt.
P-118884
wiktor12348
Temat założony przez niniejszego użytkownika
» 2014-10-19 14:11:53
Właśnie przed chwilą miałem łamigłówkę
C/C++
pierwsza * add =( pierwsza * ) malloc( sizeof( pierwsza ) );

Poprawnie?
P-118886
pekfos
» 2014-10-19 14:14:16
A działa?

C/C++
for( int i = 0; i <( n - 1 ); i++ ) {
Na pewno potrzebujesz odjąć 1 od n?
P-118887
wiktor12348
Temat założony przez niniejszego użytkownika
» 2014-10-19 14:21:40
Raczej nie.

Ostatnie pytanie. Sortuje przez scalanie (mergesort) i nawet szybko idzie. Jednak przy tym sortowaniu potrzebna jest tablica tymczasowa ją też alokuje dynamicznie ale jestem pierdoła i nie umiem jej poprawnie zdefiniować i zwolnić. Generalnie działa, ale znając życie nie jest to poprawnie.

C/C++
void mergeSort( pierwsza ** arr, int low, int mid, int high ) {
   
    int i, m, k, l;
    pierwsza ** temp =( pierwsza ** ) malloc( sizeof( pierwsza ) * 400000 );
   
    /*Algorytm sortowania*/
    /* Jeden z warunków i użycia temp */
    if( arr[ l ]->a <= arr[ m ]->a ) {
        temp[ i ] = arr[ l ];
        l++;
    }
    /*Algorytm sortowania*/
    free( temp );
}

Tak to działa, ale mam dylemat, czy poprawnie czyszczę pamieć?
P-118890
pekfos
» 2014-10-19 14:27:54
C/C++
pierwsza ** temp =( pierwsza ** ) malloc( sizeof( pierwsza ) * 400000 );
Jak masz stały rozmiar, to nie powinieneś bawić się w dynamiczną pamięć. (Przy typie w sizeof powinno być *, btw).

Raczej nie.
Podaj aktualny, w miarę kompletny kod.
P-118892
« 1 » 2 3
  Strona 1 z 3 Następna strona