[C++] Kasowanie z pamięci struktur mając wskaźnik na ich tablice
Ostatnio zmodyfikowano 2014-10-17 13:59
b0r0 Temat założony przez niniejszego użytkownika |
[C++] Kasowanie z pamięci struktur mając wskaźnik na ich tablice » 2014-10-16 23:04:29 Zakładałem poprzednio temat z tym samym programem ale tym razem przeniosłem się na C++ (o niebo łatwiej). Małe objaśnienie funkcja losowanie miała dynamicznie alokować pamięć na tablicę N wskaźników na struktury, wprowadzić dane i na końcu zwrócić adres tablicy. Funkcja kasowanie miała wczytać wskaźnik na tablice struktur (co chyba jeszcze robi) i tu zaczyna się zabawa, "zwalniana jest najpierw kolejno pamięć zajęta przez wszystkie przechowywane struktury" "następnie zwalniana jest również pamięć zajęta przez samą tablicę." z czego udało mi się jak na razie zwolnić pamięć zajętą przez tablice #include <iostream> #include <cstdio> #include <time.h> #include <stdlib.h> #include <cstdlib> using namespace std;
struct Struktura { int a; char b; double c; };
Struktura * losowanie( int N ) { Struktura * tab; tab = new Struktura[ N ]; for( int i = 0; i < N; i++ ) { ( tab + i )->a =( rand() % 1000001 ); ( tab + i )->b =( rand() & 24 ) + 65; ( tab + i )->c = 0; } for( int i = 0; i < N; i++ ) { cout <<( tab + i )->a << endl; cout <<( tab + i )->b << endl; cout <<( tab + i )->c << endl; } cout << tab + 0 << endl; cout << tab + 1 << endl; cout << tab + 2 << endl; cout << endl; return tab; }
void kasowanie( Struktura * adres, int N ) { cout << adres << endl; for( int i = 0; i < N; i++ ) { delete(( *( adres ) ) + i ); } }
void sortowanie( Struktura * adres, int N ) { }
int main() { int N = 3; Struktura * adres; clock_t begin, end; double time_spent; begin = clock(); adres = losowanie( N ); cout << adres << endl; kasowanie( adres, N ); end = clock(); time_spent =( double )( end - begin ) / CLOCKS_PER_SEC; }
|
|
michal11 |
» 2014-10-17 00:26:44 Ale ty robisz przecież zwykłą tablicę. Wystarczy w funkcji kasowanie delete[] adres; . Jeżeli natomiast chcesz zrobić tablice 2 wymiarową, to wyglądało by to mniej więcej tak: int ** create2D( int sizeX, int sizeY ) { int ** tab = new int *[ sizeX ]; for( int i = 0; i < sizeY; ++i ) { tab[ i ] = new int( ); } return tab; }
void delete2D( int ** tab, int sizeX, int sizeY ) { for( int i = 0; i < sizeX; ++i ) { delete[] tab[ i ]; } delete[] tab; } |
|
b0r0 Temat założony przez niniejszego użytkownika |
» 2014-10-17 00:51:39 Czyli nie tak jak w zwykłym C że trzeba oddzielnie kasować jedno i drugie? A co do tablicy 2D to nie. Ma być tylko jeden wymiar wczytany Oryginalna treść: pobiera jako argument liczbę N struktur, które mają zostać utworzone; o dynamicznie alokuje pamięć na tablicę N wskaźników na struktury; o następnie alokuje kolejno N struktur, przypisując uzyskane adresy do kolejnych komórek utworzonej wcześniej tablicy; o pole typu int (32 bity) jest ustawiane na wartość losową pomiędzy 0 a 1 000 000; pole typu char jest ustawiane na losową literę z zakresu A-Z; a pole typu double jest ustawiane na 0; o funkcja zwraca adres tablicy. Najchętniej bym to obszedł i do funkcji wysyłał wskaźnik i rozmiar i w niej wszystko zdefiniował mniej wiecej tak: int main() { Osoba * wskOsoba; create_n_place( wskOsoba, il ); }
void create_n_place( Osoba *& wskOsoba, int ile ) { wskOsoba = new Osoba[ ile ]; }
|
|
1aam2am1 |
» 2014-10-17 13:59:13 Masz wskaźnik. Alokujesz tablicę wskaźników. Alokujesz do każdago wskaźnika Strukturę Tak zrozumiałem z treści zadania. A to co u was widzę to złomowanie od razu tablicy Struktur. Chyba że źle rozumiem zadanie? |
|
« 1 » |