据我了解,以下程序
#include <map>
int main()
{
std::map<int,int> foo;
std::map<int,int>::iterator start = foo.begin();
while (start++ != foo.end())
;
}
应该终止,但它使用libstdc ++ 4.7.2无限循环。此程序显示的行为是否正确,或者标准库中是否存在错误?在迭代器上运算符++(int)的操作属性是什么?
答案 0 :(得分:7)
map
为空,因此第一个start++
正在尝试递增end
迭代器,这是未定义的行为。来自std::map::end()
:
返回容器最后一个元素后面元素的迭代器。 该元素充当占位符;试图访问它会导致未定义的行为。
即使后增量start++
返回start
的原始值(在这种情况下为end()
),由于存在而导致循环终止是不合理的未定义的行为。
要更正,请在递增或取消引用前检查start
是否等于foo.end()
。