Virtualny destruktor

0

Witam Serdecznie,

Tworzę wskaźnik na obiekt:

A* obiekt=new B;
obiekt->setData();
delete obiekt;

Wtedy ładnie działają destruktory klasy A i B.

Nie rozumiem, czemu destruktory nie działają jeśli nie napiszę w main tej linijki:
delete obiekt;
Żaden obiekt nie zostanie usunięty.

#include <iostream>  
using namespace std; 

class A
{
protected:
	int i;
public:
	virtual void setData()
	{
		cout<<"i=";
		cin>>i;
	}
	virtual ~A() { cout<<"Kasuje A\n"; }
};

class B:public A
{
public:
	void setData() //ulepszona metoda (wyswietlanie)
	{
		cout<<"i=";
		cin>>i;
		cout<<"i="<<i<<endl;
	}
	~B() { cout<<"Kasuje B\n"; }
};

void main()
{
	A* obiekt=new B;
	obiekt->setData();
	delete obiekt;    <----- tego nie napisze to destruktory nie dzialają  [???] 
}

Bardzo proszę o pomocną dłoń, żeby mi to wytłumaczyć jak głupiemu.

Dlaczego destruktor sam sie nie wywoła [???]
Tylko "delete" go wywoluje.
Zwykle przeciez destruktor sam sie wywoluje.

0

Jak nie napiszesz delete to nie dość, że ci destruktory nie zadziałają to jeszcze masz memlaka.

0

Wiem, ze mi pamiec wycieknie.

Ja sie pytam dlaczego destruktory nie zadzialaja jesli nie napisze delete ?

0

Deklarujesz wskaznik, a wskaznikowi destruktora nie zdefiniowales ;) Zdefiniuj zmienna tej klasy, a zobaczysz roznice. Zwalniana jest pamiec zarezerwowana na zmienna wskaznikowa (czyli na 32b 4 bajty). Wartosc wskaznika, czyli to co Cie wlasciwie interesuje nie jest ruszane.

0
tresbien napisał(a)

Wiem, ze mi pamiec wycieknie.

Ja sie pytam dlaczego destruktory nie zadzialaja jesli nie napisze delete ?

a ten msm z czego sie śmieje ?

Skoro wiesz, że pamięć wycieknie, to pewnie wiesz dlaczego - bo obiekt nie jest niszczony, więc i jego destruktor nie ma jak się wykonać (bo i po co, skoro obiekt dalej istnieje?)

johny_bravo napisał(a)

Deklarujesz wskaznik, a wskaznikowi destruktora nie zdefiniowales ;) Zdefiniuj zmienna tej klasy, a zobaczysz roznice. Zwalniana jest pamiec zarezerwowana na zmienna wskaznikowa (czyli na 32b 4 bajty). Wartosc wskaznika, czyli to co Cie wlasciwie interesuje nie jest ruszane.

Tak dla ścisłości to wartość wskaźnika znajduje się w zwalnianej pamięci ;) Nie ruszane jest to co znajduje się pod adresem na który wskaźnik pokazuje ;)

0

@up: Skrot myslowy ;)

0

używając "new" tworzysz obiekt na stercie, obiekty na stercie nie są usuwane automatycznie po wyjściu poza zakres bloku w którym zostały zdeklarowane dzięki czemu sam możesz kontrolować jak długo obiekt ma żyć, jak ci nie jest potrzebny używasz delete.
Kiedy tworzysz obiekt bez "new" jest on tworzony na stosie, wszystko ze stosu jest usuwane automatycznie gdy wyjdzie poza zakres bloku w którym został zdeklarowany.

0

generalnie taka jest specyfika C++ ze to ty (?? programista ;) ) zarzadza pamiecia
polecam zapoznac sie miedzy innymi z STL, jest tam kilka pomocnych wzorcow dajacych namiastke garbage collectora
np. auto_ptr

1 użytkowników online, w tym zalogowanych: 0, gości: 1