Rozdział 44 - weryfikacja wiedzy
Ostatnio zmodyfikowano 2019-06-27 18:25
Burzogrzmot Temat założony przez niniejszego użytkownika |
Rozdział 44 - weryfikacja wiedzy » 2019-06-25 07:21:47 Dzień dobry. Wykonałem zadanie i już nawet zdążyłem poszperać na forum przekonując się przy tym że po raz kolejny moje rozwiązanie nie jest ani wydajne, ani schludne. Najwyraźniej mój umysł nie jest tak analityczny jak kiedyś myślałem że jest. Pozostaje ciągła nauka i wiara że z czasem się trochę naprości. Ale ja nie o tym. Konkretniej mam pytanie czy dobrze rozumiem pojęcie alokalizocji. #include <iostream> using namespace std;
int main() { int rozmiar = 5, miejsce = 0; int * tablica = new int[ rozmiar ]; cout << "Podawaj liczby, 0 konczy wczytywanie" << endl; while( true ) { int liczba; cin >> liczba; if( liczba == 0 ) break; if( miejsce == rozmiar ) { int * nowa = new int[ rozmiar + 5 ]; rozmiar += 5; for( int i = 0; i < rozmiar; i++ ) nowa[ i ] = tablica[ i ]; delete[] tablica; tablica = nowa; } tablica[ miejsce ] = liczba; miejsce++; } cout << "Te same liczby, tylko od tylu" << endl; for( int i = miejsce - 1; i >= 0; i-- ) cout << tablica[ i ] << " "; delete[] tablica; } Powiem łopatologicznie jak ja to rozumiem. W fragmencie: int * tablica = new int[ rozmiar ]; tworzę wskaźnik TABLICA i nadaję mu wartość którą jest adres do zarejestrowanej pamięci o rozmiarze [ROZMIAR]. Wskaźnik ustawia się automatycznie na pierwszy element tablicy. czyli gdybym napisał samo: new int[ rozmiar ]; to zarejestrowałbym pamięć RAM o typie int i wielkości [rozmiar], ale bym do tej pamięci nie miał dostępu bo nie mam odnośnika. W sensie odnośnikiem ma być w takiej sytuacji wskaźnik? i czy skoro w moim kodzie stworzyłem na początku tą tablice o 5 miejscach, to czy tak jak rozumuje przy pierwszej sytuacji wejścia w if( miejsce == rozmiar ) zostaje ona usunięta i już od tech chwili będzie tworzona za każdym razem nowa tablica o 5 elementów większa, która będzie przypisywana wskaźnikowi TABLICA? |
|
latajacaryba |
» 2019-06-27 18:25:31 adres do zarejestrowanej pamięci o rozmiarze [ROZMIAR]. |
Zależy co przez to rozumiesz; weź pod uwagę, że pamięć zajmie ROZMIAR * sizeof(int) bajtów, a nie ROZMIAR bajtów Operator new[] zwraca void* czyli wskaźnik do miejsca w pamięci w którym została zaalokowana tablica, więc tak - wyrażenie stworzy tablicę o liczbie elementów równiej rozmiar, natomiast jeśli w momencie tego tworzenia nie przypiszesz do czegoś zwracanego adresu, to nie będziesz mógł go inaczej uzyskać, a więc w konsekwencji usunąć tablicy, co prowadzi do wycieków pamięci. int * nowa = new int[ rozmiar + 5 ]; rozmiar += 5; for( int i = 0; i < rozmiar; i++ ) nowa[ i ] = tablica[ i ];
Zauważ, że iterujesz po nieistniejących elementach tablicy "tablica", ponieważ najpierw zwiększasz rozmiar o 5 (2 linijka w powyższym fragmencie) a potem dopiero masz pętle. int * nowa = new int[ rozmiar + 5 ] { }; for( int i = 0; i < rozmiar; i++ ) nowa[ i ] = tablica[ i ];
rozmiar += 5;
Tutaj poprawiona wersja. |
|
« 1 » |