gpt4 book ai didi

c++ - 不可能的事件序列

转载 作者:IT老高 更新时间:2023-10-28 22:59:28 25 4
gpt4 key购买 nike

我试图在 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.

查看反汇编窗口会按预期顺序显示说明。我难住了。可能会发生什么?

最佳答案

终于想通了。 Microsoft 函数 _Debug_message 会显示一个对话框,询问您是要中止、重试(调试)还是忽略错误。在显示对话框时,消息泵仍在运行,允许进行其他事件。我的函数再次被调用,这次它运行完成,在此过程中生成大量调试输出。如果我在库代码中的 _DEBUG_ERROR 行上放置一个显式断点,我会捕获错误而无需在后台额外执行。事后回顾一下调试输出,我可以看到预期的错误输出确实在那里,只是埋藏得如此之深,以至于我从未见过它。

关于c++ - 不可能的事件序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17027382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com