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

question-closed Zwalnianie pamięci po obiektach (stos/kolejka/lista)

Object Storage Arubacloud
+1 głos
1,437 wizyt
pytanie zadane 7 stycznia 2016 w C i C++ przez po ile ptysie Początkujący (470 p.)
zamknięte 7 stycznia 2016 przez po ile ptysie

Cześć, może bardzo się rozpiszę, ale odpowiedz jest na jedno zdanie.
Mianowicie zacząłem pisać swoje własne implementacje struktur danych(stos/kolejka/lista) i mam pytanie odnośnie zwalniania pamięci, już pokazuję o co chodzi.
 

void Kolejka::pop() {	//funkcja usuwająca wezel struktury
	if (head == 0) {	//wiadomo, sprawdzamy czy aby nie jest pusta
		cout << "Kolejka jest pusta." << endl;
	}
	else {					//pytanie pojawia sie tutaj				
		Liczba* temp = head;//stworzylem wskaznik na pierwszy element struktury
		head = temp->next;  //tutaj zamieniam glowe kolejki na nastepny element
		delete temp;	    //wg tego co znalazlem w google, to tak ma wygladac usuniecie 
	}					    //elementu wskazanego przez wskaznik temp
}

I teraz mam np. funkcję do wyświetlania elementów struktury, czy to zliczania elementow, obojetnie, pojawia sie to samo pytanie:

int Kolejka::count() {	  //funkcja do zliczania elementow
	Liczba* temp = head;  //tworzymy wskaznik na obiekt liczba
	int n = 0;

	while (temp) {        //petla do zliczania elementow
	  n++;	
      ​temp = temp->next;
	}

	//delete temp; *DO TEJ LINIJKI ODWOLAM SIE NA NIZEJ
	return n;
}

*(wracam do tej linijki z kodu) I teraz pojawia się moje pytanie, przecież utworzyliśmy wskaźnik pomocniczy (temp), żeby moc się "przejść" po elementach struktury i je zliczyć, no ale przecież on potem nie będzie potrzebny więc należałoby go usunąć, tak? Więc napisałem delete temp; ale tutaj mi coś zaczęło nie pasować, bo w funkcji pop, do usuwania, była taka sama linijka, delete temp; i ona usuwała element a nie wskaźnik(może tutaj źle myślę?). No ale spróbowałem dopisać te linijkę do funkcji count() i element się nie usuwa. Więc pytanie czy te zapisy działają poprawnie i ja szukam dziury w całym, czy rzeczywiście jest coś źle?
 

 
 

komentarz zamknięcia: Dostałem oczekiwaną odpowiedź.

1 odpowiedź

+2 głosów
odpowiedź 7 stycznia 2016 przez Grzyboo Nałogowiec (28,860 p.)
wybrane 7 stycznia 2016 przez po ile ptysie
 
Najlepsza

Nie, musisz odróżniać wskaźnik od pamięci, na którą on wskazuje. Oto przykład.

void func()
{

Blabla* ptr1 = new Blabla(); // #patrz nizej
Blabla* ptr2 = ptr1;
Blabla* ptr3 = ptr1;

delete ptr1; // Wyczyść miejsce, które zostało zarezerwowane w #patrz nizej
}   // W tym miejscu konczy sie zasieg ptr1, ptr2 i ptr3. Sa one usuwane, tak samo jak każde zmienne automatyczne

W C++ Primer bardzo fajnie autor to wytłumaczył. Powtarzał do znudzenia, że każdemu new odpowiada jedno delete.

komentarz 7 stycznia 2016 przez po ile ptysie Początkujący (470 p.)
Czyli w pop delete temp, a w count już jest zbędne? No bo jakoś trzeba usunąć ten element.
komentarz 7 stycznia 2016 przez Grzyboo Nałogowiec (28,860 p.)

Bardzo proste:

pop - chcesz usunąć obiekt z kolejki. Dlatego musisz pamięć zajmowaną przez ten obiekt.

count - nic nie usuwasz, a więc... nie usuwasz :)

 

Wskaźników się nie usuwa delete. Delete usuwa się zarezerwowaną pamięć, i to należy zapamiętać.

komentarz 7 stycznia 2016 przez po ile ptysie Początkujący (470 p.)
Ok, zmylił mnie ten zapis w funkcji pop. Dzięki wielkie.

Podobne pytania

0 głosów
1 odpowiedź 414 wizyt
+1 głos
2 odpowiedzi 8,302 wizyt
0 głosów
0 odpowiedzi 462 wizyt

92,621 zapytań

141,477 odpowiedzi

319,817 komentarzy

62,005 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!

...