std :: map :: iterator引用不存在的对象?

时间:2011-03-28 12:58:06

标签: c++ stl

考虑以下代码:

class MyClass
{
    public:
        int someInt;
        MyClass() : someInt(666) { }
};

int main()
{
    std::map<int,MyClass> myMap;
    std::map<int,MyClass>::iterator it = myMap.end();
    const MyClass& ref = it->second;
    std::cout << ref.someInt << std::endl;
}

由于地图为空且it = myMap.end()it->second引用的对象是什么?这是一个无效的引用,因为it = myMap.end()

map<int,MyClass>不会创建MyClass的实例。

4 个答案:

答案 0 :(得分:3)

  

it->second引用的对象是什么?这是一个无效的引用,因为it = myMap.end()

事实上。 myMap.end()是一个有效的迭代器,但不能取消引用它。 it->second尝试做到这一点并导致未定义的行为。

  

map<int,MyClass>不会创建MyClass的实例。

是的,但无关紧要。 myMap.end()将始终 - 无论myMap的内容 - 包含对“一个过去结束”迭代器的引用,该迭代器绝不能被解除引用。

答案 1 :(得分:1)

std::map::end()将迭代器返回到地图中最后一个元素之后的第一个元素。如果你试图取消引用它,你将调用一个未定义的行为(google为“C鼻恶魔”)

答案 2 :(得分:0)

STL容器上的

.end()指向所包含序列的结尾之后的一个。迭代器仅对比较有效。

在引擎盖下它是一个指针,你显然可以比较,但它可能指向未映射的内存。

答案 3 :(得分:0)

这是未定义的行为,它无法执行任何操作,或者它可能会导致段违规