我似乎無法找到有關迭代器是否保持它們正在迭代的基礎對象的更多信息。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
爲了解決您的具體情況:銷燬容器將使所有迭代器無效。 –