Witam,
Mam problem, nie potrafię w żaden sposób zwolnić pamięci vectora jeśli przestaje mi być on potrzebny. Niestety w funkcji rekurencyjnej gdy cały czas tworze nowy vector a starego nie zwalniam to przekracza mi pamięć dozwoloną dla danego zadania. Próbowałem metody resize() i clear() ale z tego co zauważyłem to nie zwalnia ona zasobów. Szukałem trochę i wyczytałem, że niektórzy robią jakieś strasznie zagmatwane operacje na wskaźnikach i jakieś destruktory w klasach. Mam pytanie, czy da się to zrobić jakoś w miarę prosto?
0
0
- operacje na wskaźnikach i destruktory w klasach to nie coś zagmatwanego tylko normalne techniki.
- Da się to zrobić w miarę prosto. Pokaż kod, wtedy na pewno ktoś Ci pomoże.
0
A może nie potrzebujesz tworzyć za każdym razem nowego wektora?
0
W ogólności, jeśli tworzysz ten wektor na stosie, to pamięć sama się zwolni. Jeśli chodzi Ci o to, żeby wraz z usunięciem elementów wektora zwolnić pamięć to robisz tak (przykład na vector<int>:
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
// usuniecie elementów i zwolnienie pamięci (przypisanie pustego vectora)
v = vector<int>();
0
mój kod jest taki:
osoba magicznepiatki(vector <osoba> tab, int n, int k){
osoba m5;
vector <osoba> M;
int i;
if(n<=10){
sort(tab.begin(), tab.end(), porownaj);
return tab[k];
}
else{
m5.pesel = 4294967295;
m5.imie = "{";
m5.nazwisko = "{";
while(tab.size()%5 != 0)
tab.push_back(m5);
for (int i = 0; i < tab.size(); i+=5){
sort(tab.begin()+i, tab.begin()+i+5, porownaj);
M.push_back(tab[i+2]);
}
m5 = magicznepiatki(M, M.size()-1, M.size()/2);
M = vector<osoba>();
vector <osoba> tabm, tabr, tabw;
for (int i = 0; i <= n; i++){
if(porownaj(tab[i], m5)) tabm.push_back(tab[i]);
else if(porownaj(m5, tab[i])) tabw.push_back(tab[i]);
else tabr.push_back(tab[i]);
}
tab = vector<osoba>();
int rm = tabm.size(), rw = tabw.size(), rr = tabr.size();
if(rm-1 >= k){
tabr.resize(0);
tabw.resize(0);
return magicznepiatki(tabm, rm-1, k);
}
else if(rm+rr-1 >= k){
tabr.resize(0);
tabw.resize(0);
tabm.resize(0);
return m5;
}
else{
tabm.resize(0);
tabr.resize(0);
return magicznepiatki(tabw, tabw.size()-1, k-rm-rr);
}
}
}
próbowałem już różnych metod i niestety pochłania mi ten algorytm zbyt dużo pamięci