2014-01-15 3 views
-1

Я пытался найти способ удалить первый элемент вектора.Удаление первого элемента вектора и освобождение памяти в C++

vector<int*> vec; 
\\elements get added to the vector throughout the code 

if(GetNumIntsInVec() != 0){ 
    this->vec.erase(this->vec.begin()); 
} 

Однако, это не работает.

Нужно ли также удалить()? Мой код заставит весь вектор исчезнуть (мне нужно каким-то образом сохранить вектор?) Мои тесты показывают, что он либо не освобождает память, либо удаляет весь вектор.

Спасибо!

+3

Что такое 'vector'? Можете ли вы показать полную декларацию 'vector' (как в' std :: vector vector')? И, пожалуйста, опишите, что вы подразумеваете под «не работает». – Anthony

+0

Я добавил еще несколько деталей – user3196347

+0

Нет элементов в векторе? – michaeltang

ответ

2

Класс std::vector<T> ищет свой контент и уничтожает содержащиеся объекты. Уничтожение указателя означает «ничего не делать». Если вы хотите, чтобы объект, на который указывает элемент будет удален автоматически, вам нужно использовать то, что выглядит после delete, например, в std::unique_ptr<T>:

std::vector<std::unique_ptr<int>> vec; 
vec.emplace_back(new int(17)); 
vec.erase(vec.begin()); 

... или вам нужно явно следить за delete элементов.

В стороне: удаление объектов в передней части std::vector<T> довольно неэффективно! Если вы на самом деле пытаетесь реализовать что-то вроде очереди, вам гораздо лучше использовать std::queue<T> или, если вам нужен произвольный доступ к элементам std::deque<T>. В то время как std::vector<T> необходимо перетасовать все элементы после удаления позиции вперед, std::deque<T> может эффективно стирать спереди и в конце.

+0

Спасибо! :) Вы запустили правильную идею в моей голове и зафиксировали ее – user3196347

Смежные вопросы