C ++: ошибка сегментации при переборе вектора указателей при push_back - PullRequest
1 голос
/ 09 октября 2019

Я хочу перебрать вектор указателей, указывающих на объекты. Во время итерации, я должен push_back новые указатели на вектор. До цикла число push_backs неизвестно, и нет критерия прерывания, поэтому я не могу использовать цикл while.

Вот пример использования указателей на целые числа, который показывает ту же ошибку, что иверсия с объектами: ошибка сегментации (ядро сброшено) после одной итерации.

vector<int*> vec;
int a = 43;
vec.push_back(&a);

for (vector<int*>::iterator it = vec.begin(); it != vec.end(); ++it) {
    cout << *(*it) << " " << *it << endl;
    vec.push_back(&a);
}

Тот же код, но с целыми числами, прекрасно работает.

vector <int>vec;
int a = 43;
vec.push_back (a);

for (vector < int >::iterator it = vec.begin (); it != vec.end (); ++it){
    cout << (*it) << " " << *it << endl;
    vec.push_back (a);    
}

1 Ответ

3 голосов
/ 09 октября 2019

push_back делает недействительным итератор при добавлении результатов в size > capacity, поэтому он перераспределяет и копирует в новое пространство.

Добавляет значение данного элемента в конецконтейнер.

1) Новый элемент инициализируется как копия значения.

2) значение перемещается в новый элемент.

Если новый размер ()больше емкости (), тогда все итераторы и ссылки (включая итератор конца-в-конце) становятся недействительными. В противном случае, только последний итератор становится недействительным.

Плюс, как @Jesper указал, что вы храните ссылку на локальную переменную в вашем vector:

int a = 43; 
vec.push_back(&a);

который, если вы вышли из области видимости до вашего vector, у вас будут свисающие ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...