• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Odczyt z usuniętej tablicy

Object Storage Arubacloud
0 głosów
197 wizyt
pytanie zadane 21 lipca 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)
#include <iostream>

using namespace std;

int main()
{
    int *tablica;
    tablica = new int [5];

    for (int i=0; i<5; i++)
    {
        tablica[i]=50;
    }

    delete [] tablica;

    for (int a=0; a<5; a++)
    {
        cout << tablica[a] <<endl;
    }


    return 0;
}

Cześć wszystkim! Mam pytania do powyższego kodu. 

Dlaczego po linii "delete [] tablica;" jestem w stanie odczytać tablicę za pomocą pętli for, skoro powinna ona już nie istnieć w pamięci?

Mówiąc dokładniej, jestem w stanie częściowo odczytać tablicę, ponieważ dwie pierwsze szufladki gubią się po instrukcji delete. W dwóch pierwszych szufladkach po odczycie znajdują się losowe liczby, zapewne śmieci systemowe. (W przypadku, gdy pętla odczytująca znajduje się przed instrukcją delete, oczywiście program zachowuje się poprawnie i odczytywane są wszystkie szufladki poprawnie)

Jeszcze mam dodatkowe pytanie dotyczącej zmiennej int i. Czy jest ona widoczna tylko wewnątrz pętli? Czy mogę w drugiej pętli użyć tej samej nazwy zamiast int a?

Z góry dziękuję za odpowiedź! 

2 odpowiedzi

+2 głosów
odpowiedź 21 lipca 2018 przez Wiciorny Ekspert (269,710 p.)

 To nie działa tak: usuwasz wskaźnik, więc dlatego 1 elementy generalnie nie istnieją jednak nie zmieniasz niczego po za tym bo 

Wywołujesz niezdefiniowane zachowanie w linii 15 Usunięcie pamięci niekoniecznie zmienia zawartość tej pamięci, po prostu informuje system operacyjny, że ta pamięć jest dostępna do ponownego użycia.

komentarz 21 lipca 2018 przez MAXIM7 Obywatel (1,990 p.)
Dwie pierwsze linie odczytane w pętli to rzeczywiście śmieci, ale kolejne są równe 50, czyli mają taką wartość jaką wcześniej im przypisałem.
komentarz 21 lipca 2018 przez RafalS VIP (122,820 p.)
Czyli bardzo dobrze pasuje do określenia "niezdefiniowane zachowanie" :D
komentarz 21 lipca 2018 przez Wiciorny Ekspert (269,710 p.)
chodzi o to, że zwolnienie pamięci - nie powoduje usunięcia danych które tam zapisałeś- po prostu zwalniasz pamięć alokowaną na tablice- a to gdzie zapisane są dane w tej tablicy, rezerwująć pamięc to inna sprawa trochę
+1 głos
odpowiedź 21 lipca 2018 przez criss Mędrzec (172,590 p.)
Tablica nie istnieje z punktu widzenia języka, ale z punktu widzenia pamięci ciężko w ogóle mówić o istnieniu lub nie, bo tablica jest po prostu blokiem pamięci który istnieje tak długo jak pamięć istnieje. Także można powiedzieć, że istnieje zawsze, ale po delete[] już nie masz kontroli nad jej zawartością. delete[] zwalnia pamięć, tzn. oddaje systemowi do ponownego przydzielenia jakiemuś procesowi, ale dane zostają nieruszone tak długo jak proces któremu została ta pamięć przydzielona nie zacznie do niej pisać.
komentarz 21 lipca 2018 przez j23 Mędrzec (194,920 p.)

Także można powiedzieć, że istnieje zawsze

Nie zawsze. Na platformach z pamięcią wirtualną istnieje (w sensie dostępności) tak długo, jak dany blok pamięci jest zmapowany na fizyczną pamięć.

komentarz 21 lipca 2018 przez criss Mędrzec (172,590 p.)
No samo znaczenie "pamięć istnieje" też jest zależne od tego w jakiej abstrakcji się poruszamy, masz racje

Podobne pytania

0 głosów
1 odpowiedź 188 wizyt
pytanie zadane 16 września 2015 w HTML i CSS przez Weenter Użytkownik (830 p.)
0 głosów
1 odpowiedź 135 wizyt
0 głosów
4 odpowiedzi 961 wizyt
pytanie zadane 28 października 2018 w JavaScript przez Mikołaj Użytkownik (780 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...