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

Rozdział 44 - zwalnianie pamięci.

Ostatnio zmodyfikowano 2021-09-14 11:49
Autor Wiadomość
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:
C/C++
while( true )
{
   
int liczba;
   
std::cin >> liczba;
   
   
if( liczba == 0 )
       
 break;
   
   
// Brakuje miejsca, utwórz większą tablicę
   
int * nowa = new int[ rozmiar + 1 ];
   
   
// Skopiuj dane
   
for( int i = 0; i < rozmiar; ++i )
       
 nowa[ i ] = tablica[ i ];
   
   
// Dodaj nową wartość
   
nowa[ rozmiar ] = liczba;
   
   
// Usuń starą tablicę
   
delete[ ] tablica;
   
   
// Zakutalizuj zmienne
   
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ź.
P-178961
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)
P-178962
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?
P-178963
DejaVu
» 2021-09-14 11:33:14
Jak zwolnisz nową tablicę to stracisz wszystkie dane i nie będziesz miał 'jak' dopisywać kolejnych danych.
P-178964
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?
P-178965
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.
P-178966
Barubak
Temat założony przez niniejszego użytkownika
» 2021-09-14 11:49:30
Dziękuję - wszystko jasne :)
P-178967
« 1 »
  Strona 1 z 1