coord &c = q.front();
^^^ Эта строка устанавливает c
для ссылки на pair<int,int>
, который в настоящее время находится в начале очереди.
q.pop();
^^^ Эта строка удаляет элемент в перед очереди, уничтожая ее в процессе). Итак, после возврата этой строки ваша ссылка c
указывает на недопустимый объект, что означает, что попытка использовать c
вызовет неопределенное поведение.
Однако это происходит не каждый раз, поэтому мне интересно, может ли кто-нибудь помочь мне понять, почему это происходит.
Происходит неопределенное поведение , которое вызывается, когда вы пытаетесь использовать висящую ссылку . В поведении undefined интересно то, что «кажется, что все работает нормально» является допустимым результатом, как и буквально все остальное, что происходит - потому что, как только вы вызываете поведение undefined, все ставки отключены, авторы компилятора свободны от каких-либо обязательства, чтобы программа работала правильно оттуда, и мир сломан.
Чтобы решить проблему, вы можете либо удалить амперсанд (как вы это сделали), чтобы не было ссылки, и, следовательно, нет шансов проблемы с висячими ссылками (поскольку вместо этого вы скопировали объект очереди pair<int,int>
в локальную переменную); или, в качестве альтернативы, вы можете переместить свой вызов на q.pop()
в конец вашего while-l oop, чтобы он происходил только после того, как все ваши использования ссылки c
уже выполнены.