我试图在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");
为了获得更多信息,我编写了这个小函数来替换我!=
的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.
查看反汇编窗口会按预期顺序显示说明。我难住了。可能会发生什么?