2013-05-14 14 views
6

Mam więc wektor wskaźników tak:Jak zwolnić element w wektorze wskaźników?

vector<Example*> ve; 

wypełniam ten wektor z wskazówki jak ten

Example* e = new Example(); 
ve.push_back(e) 

ale kiedy chcę, aby je usunąć, jak mogę zapewnić, że się przydziałów? Czy to wystarczy?

ve.erase(ve.begin() + 1) 
delete ve[1] 
+2

Jedną rzeczą do rozważenia: czy potrzebują wskazówek w ogóle? Robisz, jeśli obiekty są innego rodzaju (polimorficzne); lub jeśli przenoszenie ich jest niemożliwe lub zbyt kosztowne; lub jeśli wektor nie "posiada" ich (co robi tutaj, ponieważ chcesz zwolnić je po usunięciu). W przeciwnym razie zamiast tego użyj 'vector '. –

Odpowiedz

8

Trzeba to zrobić na odwrót, oczywiście:

delete ve[1]; 
ve.erase(ve.begin() + 1); 

Jednakże, jest to znacznie bardziej korzystne jest stosowanie inteligentnych wskaźników (takich jak std::unique_ptr) zamiast surowych wskaźników gdy wyrażając własność.

1

Trzeba usunąć wskaźniki przed kasowania wektor:

for (vector<Example *>::iterator it = vec.begin(); it != vec.end(); it++) { 
    delete *it; 
} 

vec.clear(); 
+0

Użyj 'vec.clear()' zamiast 'vec.erase (vec.begin(), vec.end())'. –

+0

@MikeDeSimone Fair wystarczająco, naprawiony. –