我试图在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");
Run Code Online (Sandbox Code Playgroud)
为了获得更多信息,我写了这个小函数来替换我!=在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(); …Run Code Online (Sandbox Code Playgroud) 调试模式下的Windows CRT将显示"中止,重试,忽略"窗口,如果应用程序命中assert(false),有时它会多次创建并填满我的屏幕.
如果断言在调试器中断开而不问我任何问题,我会喜欢它.
我也试图修改报告钩子.它会在出现25-30"Abort"对话框后被调用.
我正在构建一个由单独的程序加载的DLL,如果这有帮助的话.它看起来像加载我的DLL的主机程序与调用我的代码的线程不一致.似乎其中一个线程已停止,但其他线程仍在运行.
如何配置CRT来执行此操作?