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;
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)
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 }
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.
@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.
93,772 zapytań
142,730 odpowiedzi
323,382 komentarzy
63,369 pasjonatów
Motyw:
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
Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.