Zwolnienie wektora z pamięci.

Zwolnienie wektora z pamięci.
FR
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 9 lat
  • 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?

edytowany 1x, ostatnio: freekill
NI
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 5 lat
  • 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ę


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
edytowany 1x, ostatnio: Niikelion
fasadin
nie zwalnia pamieci jezeli on sam zaalokowal pamiec wczesniej. A "korzystam z własnego wektora i dzięki temu się o to nie martwię" jest nieprawda. Po prostu zle korzystacie z std::vector
Resident
  • Rejestracja:prawie 16 lat
  • Ostatnio:ponad rok
  • Postów:195
0

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


...
FR
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 9 lat
  • Postów:27
0

no jak widać ja mam błąd.

Czym to może być spowodowane?

NI
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 5 lat
  • Lokalizacja:Warszawa
  • Postów:535
0

kompilator?


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
FR
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 9 lat
  • Postów:27
0

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

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
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:ponad 11 lat
  • Ostatnio:prawie 2 lata
  • 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

edytowany 2x, ostatnio: stryku
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:prawie 11 lat
  • Ostatnio:ponad 9 lat
  • 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.