我似乎无法找到有关迭代器是否保持它们正在迭代的基础对象的更多信息。C++迭代器是否持有对基础对象的引用?
如果我创建一个迭代器,那么提供它的对象超出了作用域,迭代器的存在是否阻止它被销毁?
这里是一个非常简单的例子只是为了说明的情形:
// This class takes a copy of iterators to use them later
class Data {
public:
Data(std::vector<int>::iterator start, std::vector<int>::iterator end)
: start(start),
end(end)
{}
void show() {
// Use this->start and this->end for some purpose
}
private:
std::vector<int>::iterator start;
std::vector<int>::iterator end;
};
Data test() {
std::vector<int> v{1, 2, 3};
Data d(v.begin(), v.end());
d.show(); // this would be ok
return d;
}
int main(void) {
Data d = test();
d.show(); // What happens here?
}
在这个例子中,Data
对象被存储所述迭代器的副本,这是细用于第一show()
呼叫。然而,在第二次调用show()
时,提供迭代器的原始对象不再存在。
迭代器是否保持对象的状态,直到它们全部被销毁,或者只要原始对象超出范围,迭代器就会失效?
这里是one reference of many不说会发生什么的一种方式或其他(甚至是否这样做的结果是“不确定”。)
迭代器在指针上建模。粗略地说,如果一个指针不能做一个高级的事情X,那么迭代器也不能。 –
是的,迭代器将失效,结果是未定义的。 – songyuanyao
为了解决您的具体情况:销毁容器将使所有迭代器无效。 –