C ++ std :: vectorесли вы удерживаете указатель на элемент указателя, становится ли он недействительным при изменении размера? - PullRequest
3 голосов
/ 06 ноября 2019

Допустим, я создаю std::vector<int*> myVec;, резервирую 100 записей и заполняю вектор значениями, чтобы все 100 элементов имели действительные указатели. Затем я кеширую указатель на один из элементов,

int * x = myVec[60];

Затем, если я добавляю еще один int *, который вызывает изменение размера вместе с перемещением из-за фрагментации кучи, предыдущий указатель на указатель становитсяпризнан недействительным или указывает на новое место в памяти?

Если мои серверы памяти меня исправили, если в примере было std::vector<int> myVecTwo с теми же условиями, что и выше, и я сохранил ptr вроде

int * x = &myVecTwo[60]; 

и приступил к добавлению и изменению размера, тоуказатель будет недействительным.

Итак, мой вопрос заключается в следующем. Указатель на указатель станет недействительным? Я больше не уверен из-за новой функциональности C ++ std is_trivially_copyable и того, использует ли std :: vector такую ​​функциональность или проверки POD.

Будет ли указатель недействительным в C ++ 11?

1 Ответ

5 голосов
/ 06 ноября 2019

Нет.

Как вы показали, после перераспределения указатели на элементы vector, такие как int * x = &myVecTwo[60];, будут недействительными. После перераспределения сами элементы будут скопированы, но объект, на который указывают указатели элементов, не будут затронуты, тогда для int * x = myVec[60];, после перераспределения x все еще указывает на тот же объект, который не имеет ничего общегос перераспределением vector.

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