Я пытаюсь найти загадочную проблему итератора в цикле for
. Я получаю сообщение об ошибке в итераторе operator!=
, что обычно означает, что сравниваемые итераторы не принадлежат одному и тому же контейнеру. Прослеживая реализацию Microsoft в библиотеке, operator!=
вызывает operator==
, где этот тест верен:
bool operator==(const _Myiter& _Right) const
{ // test for iterator equality
#if _ITERATOR_DEBUG_LEVEL == 2
if (this->_Getcont() == 0
|| this->_Getcont() != _Right._Getcont())
{ // report error
_DEBUG_ERROR("list iterators incompatible");
В попытке получить дополнительную информацию я написал эту небольшую функцию для замены my !=
в цикле for
:
template<typename iter>
bool bang_equal(const iter & left, const iter & right)
{
static int count = 0;
auto p1 = left._Getcont();
auto p2 = right._Getcont();
ATLTRACE("Iterator comparison left _Getcont()=%p right _Getcont()=%p %d\n", p1, p2, ++count);
MemoryBarrier();
bool b = left != right;
MemoryBarrier();
auto p3 = left._Getcont();
auto p4 = right._Getcont();
ATLTRACE(" left _Getcont()=%p right _Getcont()=%p %d\n", p3, p4, ++count);
return b;
}
Здесь, где это становится интересным. Я все еще получаю ошибку в выражении left != right
, и отладчик останавливается там, но либо первый ATLTRACE
был пропущен, либо второй запустился раньше времени! Выход отладчика имеет обе строки, а значение count
, как показано отладчиком, соответствует последней строке вывода.
Iterator comparison left _Getcont()=07D0B2C8 right _Getcont()=07D0B2C8 2984
left _Getcont()=07D0B2C8 right _Getcont()=07D0B2C8 2985
Myprog.exe has triggered a breakpoint.
В окне разборки отображаются инструкции в ожидаемом порядке. Я в тупике. Что может произойти?