Zwolnienie wektora z pamięci.

Zwolnienie wektora z pamięci.
FR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 27
0

Witam, mam problem ze zwalnianiem wektora.

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

Kopiuj
class A {}

class B:public A;

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

Kopiuj
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:

Kopiuj
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?

NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 535
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:

Kopiuj
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ę

Resident
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 195
0

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

FR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 27
0

no jak widać ja mam błąd.

Czym to może być spowodowane?

NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 535
0

kompilator?

FR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 27
0

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

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
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*>)

stryku
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 607
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

  • Rejestracja: dni
  • Ostatnio: dni
3

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

Kopiuj
class A
{
public:
virtual ~A() { }
};
FR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 27
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:

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.