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

Program przestaje działać po wywołaniu "delete" na obiekcie

0 głosów
601 wizyt
pytanie zadane 12 września 2018 w C i C++ przez Nekronomik Użytkownik (600 p.)

Witam, jak w temacie. kod:
 

Obiekt*w1,*w2;
	w1=&gracz;
	w2=&stacja;
	
	w1->informacje();
	w2->informacje();
	
	delete w2;
	
	w2=NULL;
	w2=w1;
	w2->informacje();

Po linijce delete w2; program już się nie wykonuje; 

1 odpowiedź

0 głosów
odpowiedź 12 września 2018 przez RafalS VIP (122,780 p.)
edycja 13 września 2018 przez RafalS

Wygląda jakbyś próbował zwolnić pamięć alokowaną automatycznie na stosie. Tego nie wolno. Pamięć alokowana na stosie zwalnia się sama gdy zasób wyjdzie poza zakres.

Na rządanie - czyli przy pomocy delete - możesz zwalniać jedynie pamięć zaalokowaną dynamicznie (czyli przez new albo w stylu C malloc / calloc / realloc)

komentarz 12 września 2018 przez Nekronomik Użytkownik (600 p.)
Zapomniałem o tym new :D
dzięki wielkie.
komentarz 12 września 2018 przez RafalS VIP (122,780 p.)

Zabrzmiało to jakbyś nie do końca wiedział po co jest dynamiczna alokacja :P.

#include <iostream>

int* stworzTablice() {
	int tab[10];
	//nie zadziała, po wyjściu z funkcji pamięć na którą
	//wskazuje tab zostanie zwolniona automatycznie
	//nie bedzie juz do nas nalezec
	return tab;
}

int* stworzTabliceNew() {
	int * tab = new int[10];
	//ale to zadziała, bo tym razem my kontrolujemy
	//kiedy pamiec zostaje zwalniana
	return tab;
}

int main() {
	int *tablica_zla = stworzTablice();
	tablica_zla[4] = 10; //undefined behaviour, np segmentation fault
	int *dobra_tablica = stworzTabliceNew();
	dobra_tablica[9] = 100; //wszystko cacy, pamiec dalej nalezy do nas
	delete[] dobra_tablica;
	dobra_tablica[4] = 40; //a tutaj juz do nas nie nalezy :(
	//roznica jest taka, ze programista decyduje kiedy pamiec jest zwalniana
}

 

komentarz 12 września 2018 przez Nekronomik Użytkownik (600 p.)

Napisałem na szybko kod aby sprawdzić czemu dostaję w wierszu poleceń informacje pure virtual method called a to new kompletnie z głowy mi wyleciało.

komentarz 13 września 2018 przez j23 Mędrzec (195,220 p.)

@RafalS,
 

czyli przy pomocy delete - możesz zwalniać jedynie pamięć zaalokowaną dynamicznie (czyli przez new albo w stylu C malloc / calloc / realloc)

delete może użyć tylko dla pamięci przydzielonej przez new.

komentarz 13 września 2018 przez RafalS VIP (122,780 p.)
Dzieki. Nigdy nie probowalem mieszac jezykow przy dynamicznej alokacji

Podobne pytania

0 głosów
2 odpowiedzi 337 wizyt
0 głosów
3 odpowiedzi 861 wizyt

93,772 zapytań

142,730 odpowiedzi

323,382 komentarzy

63,369 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...