迭代器生命期

问题描述 投票:2回答:1

这是这种情况:

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

现在,我在网络上找不到任何资源可以告诉我这是UB还是有效的代码。

我的问题是:当我创建一个迭代器时,如果该迭代器的生存期比所引用的容器长,是未定义的行为还是在标准中的某个位置定义了?

c++ vector iterator lifetime
1个回答
2
投票

在您发布的代码中,

(**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");
© www.soinside.com 2019 - 2024. All rights reserved.