【问题标题】:Dereferencing iterator behavior in C++在 C++ 中取消引用迭代器行为
【发布时间】:2020-08-25 21:07:36
【问题描述】:

我试图弄清楚为什么取消引用空列表迭代器会阻止其余代码运行。注释掉该行,一切看起来都很好,但是将其保留下来,程序似乎并没有超过这一点。

我想这应该是一个错误,因为列表是空的,但我没有收到任何警告或错误。

我在 MinGW 中使用代码块

    std::list<std::string> slist;
    std::string word;

    auto iter = slist.begin();

    //what is this doing?
    std::cout << (*iter) << std::endl;

    while(std::cin >> word)
    {
        iter = slist.insert(iter, word);
    }

    slist.insert(slist.begin(), {"foo", "bar"});
    for(auto item: slist)
        std::cout << item << std::endl;

【问题讨论】:

  • 这是未定义的行为。任何事情都有可能发生。
  • 但我没有收到任何警告或错误。 -- 也许在具有迭代器检查的调试版本中,例如 Visual Studio,您会收到错误消息。但除此之外,C++ 不会检查并且行为未定义。
  • 如果slist 是一个空列表,它的begin() 迭代器等价于end() 迭代器。取消引用结束迭代器(更好地命名为“结束”)会产生未定义的行为。 list 是一种库类型,因此编译器无法预测其在运行时确定的行为(例如其内容是什么)。
  • en.cppreference.com/w/cpp/language/ub 也阅读了底部链接的文章。

标签: c++ c++11 iterator


【解决方案1】:

std::list 是空的!取消引用意味着您正在尝试使用未定义的内容。这是错误的。你绝对不应该那样做。

你应该这样做

for (auto i : slist)
   std::cout << i << std::endl;

这是安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2015-09-21
    • 2015-01-13
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 2014-12-26
    相关资源
    最近更新 更多