используя вектор C ++ в качестве буфера - PullRequest
1 голос
/ 20 марта 2012

Я использую вектор как буфер для хранения некоторых объектов, которые впоследствии будут добавлены к другому вектору.

std::vector<Link*> buffer_vector;
std::vector<Link*> main_vector;
main_vector.insert(main_vector.end(),buffer_vector.begin(),buffer_vector.end());

Процесс заполнения буфера и добавления происходит многократно. Поэтому мне нужно очищать буфер на каждой итерации. Меня беспокоит, если я использую методы .erase или .clear для очистки буфера, объекты в главном векторе будут удалены. Это предположение верно? Если да, есть ли обходной путь для этого?

Спасибо

Вахид

Ответы [ 6 ]

2 голосов
/ 20 марта 2012

Ваша проблема неверна.

main_vector.insert(main_vector.end(),buffer_vector.begin(),buffer_vector.end()); копирует элементы из buffer_vector в main_vector.

Эти скопированные элементы полностью отделены от исходных элементов, поэтому на них не влияют модификации элементов, из которых они были скопированы.

1 голос
/ 20 марта 2012

Вы можете быть озадачены тем, как vector управляет своими объектами.Когда вы push_back в вектор, вы делаете копию.Когда вы push_back указатель, он копирует указатель.Когда вы вызываете clear() или erase(), он удаляет указатель, но не объект , на который указывает указатель.

Я предполагаю, что вы new 'отредактировали все свои объекты Link и добавили их в контейнер vector.Вам нужно будет удалить их самостоятельно, контейнер не будет уничтожать указанный вами объект (даже если сам контейнер уничтожается, когда выходит из области видимости).Если вы clear() оба своих контейнера перед вызовом delete для всех своих Link объектов, вы вызовете утечку памяти (при условии, что вы не сохраняете указатели на Link объекты в другом месте).

1 голос
/ 20 марта 2012

В показанном вами коде вы храните указатели на объекты. Указатели будут скопированы, и с выделенной памятью ничего не произойдет, если исходный вектор будет clear ed или элементы erase d.

На самом деле ничего не случится с заостренной памятью, когда второй вектор выйдет за рамки !! Ваша программа теряет память, вам нужно вручную управлять указателями или выбрать подходящий интеллектуальный указатель, который вы можете использовать внутри вектора (рассмотрим std::unique_ptr или std::shared_ptr из C ++ 11 или эквиваленты из boost или TR1).

1 голос
/ 20 марта 2012

Вы копируете элементы в вектор, и они будут оставаться там до тех пор, пока вы их не удалите.

1 голос
/ 20 марта 2012

Вставка в вектор осуществляется копией. Другими словами, вы помещаете копию элемента в новый вектор. Другая копия будет удалена при очистке вектора буфера.

(Предполагается, что вы вводите один и тот же тип в оба вектора, а не что-то вроде указателя на элемент на вектор из первого вектора во второй вектор.)

1 голос
/ 20 марта 2012

Если вы имеете в виду, очистка buffer_vector очистит содержимое в main_vector, нет, это отдельные копии.

...