Время жизни итератора - PullRequest
2 голосов
/ 13 апреля 2020

Итак, вот такая ситуация:

vector <string>::iterator * it;
{
    vector <string> v{"asd", "asd"};
    auto iter = v.begin();
    it = new vector <string>::iterator(iter);
}
(**it) = string("asd");

Теперь я не могу найти в Интернете никаких ресурсов, которые бы сообщали мне, является ли это UB или это действительный код.

Мой вопрос таков:
когда я создаю итератор, если этот итератор имеет время жизни больше, чем контейнер, на который ссылается, это неопределенное поведение или определено где-то в стандарте?

1 Ответ

2 голосов
/ 13 апреля 2020

В опубликованном вами коде

(**it) = string("asd");

вызывает неопределенное поведение.

*iter является итератором, но соответствующий vector не существует к тому времени, когда вы достигнете этой строки. Следовательно, **iter аналогично разыменованию висячего указателя. Кстати, это не изменится, если вы будете использовать iterator вместо iterator*.

Следующий код также вызывает неопределенное поведение.

vector <string>::iterator it;
{
    vector <string> v{"asd", "asd"};
    auto iter = v.begin();
    it = iter;
}
(*it) = string("asd");
...