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

Odczyt z usuniętej tablicy

0 głosów
82 wizyt
pytanie zadane 21 lipca 2018 w C i C++ przez MAXIM7 Obywatel (1,690 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 Maniak (66,480 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,690 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 (115,400 p.)
Czyli bardzo dobrze pasuje do określenia "niezdefiniowane zachowanie" :D
komentarz 21 lipca 2018 przez Wiciorny Maniak (66,480 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 (171,460 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 VIP (108,680 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 (171,460 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ź 93 wizyt
pytanie zadane 16 września 2015 w HTML i CSS przez Weenter Użytkownik (830 p.)
0 głosów
1 odpowiedź 71 wizyt
0 głosów
4 odpowiedzi 229 wizyt
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

67,186 zapytań

114,135 odpowiedzi

241,913 komentarzy

46,173 pasjonatów

Przeglądających: 278
Pasjonatów: 8 Gości: 270

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...