【问题标题】:What happens when std::iterator is accessed outside its boundary(end)?当 std::iterator 在其边界(结束)之外访问时会发生什么?
【发布时间】:2019-08-07 14:12:47
【问题描述】:

我尝试运行下面的代码来检查迭代器的可访问性:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> n = {1,24,5,4};
    vector<int> :: iterator itr;

    itr = n.begin();
    for(;;itr++){
        cout<<*itr<<endl;
    }
    return 0;
} 

程序在结束时执行并退出了分段错误。 我从中了解到,直到某些迭代,迭代器返回的值在其边界之外和该程序崩溃之后为零。 我想知道当我们在它的边界之外访问迭代器时会发生什么,如果它像一个指针一样,它指向什么?

【问题讨论】:

  • 这是未定义的行为。
  • “我想知道当我们在迭代器边界之外访问迭代器时会发生什么……” 你可能杀死了一群可爱的小猫。无法判断调用 undefined behavior 会发生什么。
  • 虽然,平心而论,可爱的小猫很可能是被鼻恶魔附身了,所以摆脱了!

标签: c++ vector stl iterator


【解决方案1】:

任何事情都可能发生。这是未定义的行为,编译器不需要做任何特定的事情。事实上,如果您的程序包含 UB anywhere,则允许将您的整个程序视为无效并发出它想要的任何代码

一旦你破坏了语言的规则(比如取消引用指向越界的迭代器),你就离开了定义明确的 C++ 领域,你就不能再拥有任何对行为的预期。

【讨论】:

  • 感谢您的回答,是的,当访问范围外的迭代器时,理解它的未定义行为。当我访问少量迭代(比如 10 次)时,代码不会崩溃,可能是从任意位置访问值。
  • @VikasRokade “当我访问少量迭代(比如 10 次)时,代码不会崩溃”- 不保证。它仍然是 UB,并且使用不同的编译器、不同的优化选项、不同的硬件平台或只是稍微不同的运行时环境,它可能会崩溃(或更糟;似乎可以工作,默默地破坏内存并在 10 小时后在中间崩溃)晚上在你最大的客户那里)。
猜你喜欢
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 2019-05-27
相关资源
最近更新 更多