Rozdział 44 - zwalnianie pamięci.
Ostatnio zmodyfikowano 2021-09-14 11:49
Barubak Temat założony przez niniejszego użytkownika |
Rozdział 44 - zwalnianie pamięci. » 2021-09-14 11:06:59 Witam, Nie wiem czy dobrze rozumiem przykład z tego rozdziału: while( true ) { int liczba; std::cin >> liczba; if( liczba == 0 ) break; int * nowa = new int[ rozmiar + 1 ]; for( int i = 0; i < rozmiar; ++i ) nowa[ i ] = tablica[ i ]; nowa[ rozmiar ] = liczba; delete[ ] tablica; tablica = nowa; rozmiar++; }
Czy po zaktualizowaniu zmiennych nie powinno być "delete[] nowa;". Jeżeli dobrze rozumiem ten rozdział to bez tej linijki każda iteracja będzie rezerwować nową pamięć pod "int * nowa = new int[ rozmiar + 1 ]" bez zwalniania tej już użytej? Tak przy okazji jak na to patrzę to w linijce "// Zakutalizuj zmienne" jest błąd ortograficzny ;) Z góry dzięki za odpowiedź. |
|
DejaVu |
» 2021-09-14 11:11:06 Ten kod wygląda poprawnie. 1. Tworzysz większą tablicę (nowa) 2. Kopiujesz dane ze starej tablicy do nowej 3. Dodajesz element do nowej tablicy 4. Zwalniasz starą tablicę (bo przepisałeś już wyniki do nowej) |
|
Barubak Temat założony przez niniejszego użytkownika |
» 2021-09-14 11:29:05 No tak - ale czy po zaktualizowaniu zmiennych nie powinienem też zwolnić nowej tablicy? |
|
DejaVu |
» 2021-09-14 11:33:14 Jak zwolnisz nową tablicę to stracisz wszystkie dane i nie będziesz miał 'jak' dopisywać kolejnych danych. |
|
Barubak Temat założony przez niniejszego użytkownika |
» 2021-09-14 11:46:23 No rzeczywiście wysypuje się program po wstawieniu "delete[] nowa;". Spojrzałem na to pod innym kątem i dopiero teraz widzę o co chodzi:
1. int * nowa = new int[ rozmiar + 1 ]; - tworzymy większą tablicę. 2. delete[ ] tablica; - kasujemy starą. 3. tablica = nowa; - tablica "przejmuje" dane z "nowej" i używa jej adresu, przez co w trakcie działania programu operujemy tylko na dwóch adresach tablic.
Dobrze to zrozumiałem? |
|
DejaVu |
» 2021-09-14 11:48:21 W kroku #3 po prostu przypisujesz wskaźnik pod którym jest nowa tablica do wskaźnika 'tablica', który stał się nieprawidłowy po zwolnieniu pamięci w kroku #2. |
|
Barubak Temat założony przez niniejszego użytkownika |
» 2021-09-14 11:49:30 Dziękuję - wszystko jasne :) |
|
« 1 » |