Zwolnienie wektora z pamięci.

0

Witam, mam problem ze zwalnianiem wektora.

Otóż, powiedzmy, że mam Klase Bazową i pochodną

class A {}

class B:public A;

tworze sobie obiekty, umieszczam wskaźniki do nich w vectorze:

vector <A*> tab;

A *obiektA;
B *obiektB;

obiektA=new A();
obiektB = new B():;

tab.push_back(obiektA);
tab.push_back(obiektB);

wszystko śmiga, przegladanie vectora, iteracja po nim, jednak przy próbie zwolnienia vectora:

for (vector <A*>::iterator it = tab.begin(); it != tab.end(); it++)
			delete(*it);

ładnie usuwa wskaźniki na obiekty klasy A, jednak gdy jest do usunięcia obiektB wywala błąd

cca4413bfc.png

Jakaś podpowiedź? Rozwiązanie?

0

jakoś ciekawie to robisz... nie jestem pewien ale chyba vector.clear() czyści cały wektor i zwalnia pamięć, a jak nie to ja to robię tak:

for (int i=0; i<tab.size(); i++)
{
    delete tab[i];
}
 

i zapewne się mylę, bo korzystam z własnego wektora i dzięki temu się o to nie martwię

0

Przecież takie coś działa bez błędu..
https://ideone.com/GvYwRe

0

no jak widać ja mam błąd.

Czym to może być spowodowane?

0

kompilator?

0

nie. Próbowałem na visualu 13 ten kod z ideone i działa.

1

nie jestem pewien ale chyba vector.clear() czyści cały wektor i zwalnia pamięć,

Zwalnia pamięć wektora, ale nie wykonuje destruktorów i nie zwalnia samych przechowywanych obiektów (jeśli mowa o vector<T*>)

1

user image
Mi z fusów wyszedł tylko Ponurak, więc zachęcam Cie do wrzucenia swojego kodu. Wtedy będziemy wiedzieli co robisz źle.

EDIT
A tak wgl jak nie masz przymusu operowania na gołych new i delete to polecam użycie smart pointerów. http://en.wikipedia.org/wiki/Smart_pointer#C.2B.2B_smart_pointers

3

A ja jako że lubię sobie powróżyć z fusów to obstawiam, że kolega nie zdefiniował wirtualnego destruktora w klasie A:

class A
{
public:
virtual ~A() { }
};
0
maly_ludek napisał(a):

A ja jako że lubię sobie powróżyć z fusów to obstawiam, że kolega nie zdefiniował wirtualnego destruktora w klasie A:

class A
{
public:
virtual ~A() { }
};

Proponował bym pójscie na kogoś, kto umie wróżyć z fusów.

Rzeczywiście, po zadeklarowaniu wirtualnego destruktora, wszystko działa... Szacun. Dzieki za pomoc.

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