Является ли адрес первого элемента вектора фиксированным? - PullRequest
1 голос
/ 28 января 2012

Например, если я сделаю что-то вроде этого:

vector<int> myvector;
myvector.push_back(100);
int * ptr = &(myvector[0]);
myvector.clear();
myvector.push_back(10);

Будет ли ptr еще действительным? Или теперь он может указывать на мусор?

Ответы [ 2 ]

7 голосов
/ 28 января 2012

23.2.3 §4 говорит:

a.clear() [...] делает недействительными все ссылки, указатели и итераторы , относящиеся к элементам a иможет сделать недействительным итератор «за конец».

Поскольку не существует такого понятия, как «аннулирование», использование ptr после clear приводит к неопределенному поведению.* На заметку, скобка в &(myvector[0]) не нужна.Постфиксные операторы всегда имеют более высокий приоритет, чем префиксные операторы в C ++, поэтому писать &myvector[0] просто отлично.

3 голосов
/ 28 января 2012

Это может указывать на мусор.vector перераспределяет память по мере необходимости, когда экземпляр увеличивается или уменьшается, поэтому вы не можете полагаться на неизменность адреса.Вот почему типы, используемые для vector, должны соответствовать ограничениям, совместимым с STL, таким как возможность копирования.Вот почему auto_ptr небезопасно в контейнерах STL.

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