Вектор итератор не разыменовывается ошибка во время push_back () - PullRequest
0 голосов
/ 27 мая 2019

Приведенный ниже код работает в режиме выпуска и вызывает ошибку в g_ItemList.push_back () только в режиме отладки. Я просмотрел несколько SO-сообщений и форумов.Кто-то упомянул «Вы не можете выполнять итерацию по вектору во время нажатия, поскольку push_back может сделать недействительными итераторы» .Но мне не понятно.Может ли кто-нибудь объяснить логику и как это исправить?Я использую Visual Studio 2010 (v100) для компиляции программы

std::vector<class PPart> VECT_ITEMS;    
VECT_ITEMS g_ItemList;
g_ItemList.clear();

for (i = 0; i < n; i++)
    g_ItemList.push_back (temp[i]);     //where PPart *temp;

Сообщение об ошибке enter image description here

1 Ответ

2 голосов
/ 27 мая 2019

Вектор по сути является оберткой вокруг массива. Данный массив имеет определенный размер, и данные вектора сохраняются как первые n элементов этого массива, где n - это размер вектора, а размер массива больше или равен п . Когда вы вызываете push_back, а вектор не имеет достаточного пространства во внутреннем массиве, он создает новый файл большего размера (часто удваивает массив, размер которого теперь недостаточен) и копирует все элементы векторов в этот массив до удаление старого (эти массивы хранятся в куче и создаются через new и delete).

Итераторы по сути являются указателями на этот внутренний массив¹. Таким образом, когда вы вызываете push_back, все текущие итераторы могут быть признаны недействительными. Это потому, что, возможно, был создан новый массив, а указатели на старый массив ссылаются на освободившуюся память. Технически, когда вы вызываете push_back и затем разыменовываете итератор, созданный до этого вызова, это неопределенное поведение .

1: Технически они являются классовыми оболочками указателей на внутренний массив, но принцип действует в любом случае. Часто, но не всегда, полезно думать о них просто как о указателях.

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