为什么C++如何改变旧迭代器的值

为什么C++如何改变旧迭代器的值,c++,C++,我声明了一个指向vector::iterator的指针,然后比较了vector::begin和vector::end,但通过这样做,它改变了我之前声明的vector::iterator指针的状态。我尝试先复制迭代器并使用它,但在第一个示例中它都不起作用。通过在括号外声明临时副本,这个问题在第二个示例中得到了解决,但我还有一个不需要的额外变量。那么,在改变状态的迭代器中发生了什么,为什么它只发生在第一个迭代器中 int main() { std::vector<int> x{

我声明了一个指向vector::iterator的指针,然后比较了vector::begin和vector::end,但通过这样做,它改变了我之前声明的vector::iterator指针的状态。我尝试先复制迭代器并使用它,但在第一个示例中它都不起作用。通过在括号外声明临时副本,这个问题在第二个示例中得到了解决,但我还有一个不需要的额外变量。那么,在改变状态的迭代器中发生了什么,为什么它只发生在第一个迭代器中

int main()
{
    std::vector<int> x{ 1, 2 };

    std::vector<int>::iterator *a = nullptr;

    {
        std::vector<int>::iterator b = x.begin();
        a = &b;
    }

    std::cout << &(**a) << '\n';

    x.begin() == x.end();

    std::cout << &(**a) << '\n';

    return 0;
}

在第一种情况下,指针a指向超出范围的局部变量b,也就是说,它是一个悬空指针,取消引用它会导致未定义的行为。

在第一种情况下,指针a指向超出范围的局部变量b,也就是说,它是一个悬空指针,取消引用它会导致未定义的行为。

这与迭代器无关。您正在创建指向局部变量的指针。当执行离开定义局部变量的块时,局部变量将被销毁,指针将无效:

int *a;
{
    int b;
    a = &b;
} // b is destroyed here
// a is now a garbage pointer

您的第二个示例通过在更大的块中定义局部变量来避免这个问题,这样它可以保持更长的活动时间。

这与迭代器无关。您正在创建指向局部变量的指针。当执行离开定义局部变量的块时,局部变量将被销毁,指针将无效:

int *a;
{
    int b;
    a = &b;
} // b is destroyed here
// a is now a garbage pointer

您的第二个示例通过在更大的块中定义局部变量来避免问题,从而使其保持更长的活动时间。

迭代器与此无关。您正在捕获一个自动变量的地址,该变量在作用域退出时被销毁,将捕获的地址保留为悬空指针。为什么要这样做?在处理迭代器时,几乎不需要显式地使用指针。迭代器的复制成本很低。不需要指针。@ChristianHackl我之所以使用指针,是因为我需要一种方法将其设置为空nullptr,而不是将其设置为指针,并将end设置为空,这不起作用,因为在编辑向量后,上一个端点与编辑向量的末尾不匹配。迭代器与此无关。您正在捕获一个自动变量的地址,该变量在作用域退出时被销毁,将捕获的地址保留为悬空指针。为什么要这样做?在处理迭代器时,几乎不需要显式地使用指针。迭代器的复制成本很低。不需要指针。@ChristianHackl我之所以使用指针,是因为我需要一种方法将其设置为空nullptr,而不是将其设置为指针,并将“结束”设置为空,这样做不起作用,因为在编辑向量后,上一个结束与编辑向量的结束不匹配。