std :: map :: iterator ссылается на несуществующий объект? - PullRequest
3 голосов
/ 28 марта 2011

Учитывая следующий код:

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 ]

3 голосов
/ 28 марта 2011

на какой объект ссылается it->second?Это недействительная ссылка, потому что it = myMap.end()?

Действительно.myMap.end() является действительным итератором, но на него нельзя ссылаться.it->second пытается сделать именно это и вызывает неопределенное поведение.

map<int,MyClass> не создает экземпляр MyClass.

Верно, но не имеет значения.myMap.end() всегда - независимо от содержания myMap - будет содержать ссылку на итератор «один конец», который никогда не должен быть разыменован.

1 голос
/ 28 марта 2011

std :: map :: end () возвращает итератор к первому элементу после последнего элемента на карте. Если вы попытаетесь разыменовать его, вы будете вызывать неопределенное поведение (Google для «C nasal demons»)

0 голосов
/ 28 марта 2011

Это неопределенное поведение, оно может ничего не делать или может привести к нарушению сегмента

0 голосов
/ 28 марта 2011

.end() в контейнере STL указывает на один конец конца содержащейся последовательности. Итератор действителен только для сравнения.

Под крышкой находится указатель, который вы, очевидно, можете сравнить, но который может указывать на не отображенную память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...