【问题标题】:Debug assertion failed in c++ [closed]C ++中的调试断言失败[关闭]
【发布时间】:2016-03-29 16:32:33
【问题描述】:

我正在尝试开发代码 (visual studio 2012) 来控制首先读取声纳传感器的移动机器人。
我创建了以下函数:

void layer1(ArRobot *robot,ArSonarDevice *sonar)// this is the avoid front collision layer
{
    double range=sonar->currentReadingPolar(-50.0,50.0)-300;
    cout<<range<<"\n";
    //read sonar in front (subtract robot diagonal) and if <200 act
    if(range<200)
    { 
        robot->setVel(-50);robot->setRotVel(50);//move backwards and rotate
        ArUtil::sleep(200);//sleep to give time to robt to react
    }
 } 

当我运行它(调试模式)时,我得到了错误:

调试断言失败程序 C:\Windows\system32\MSVCP110D.dll

它说表达式:列表迭代器不可取消引用

我搜索了这个网站,发现了这个: What exactly is the "Multi-threaded Debug DLL" Runtime Library option doing in VS 2008?

我确定我使用的是调试 dll 运行时库,但没有区别。我也检查了这个问题,它帮助我理解了为什么会显示此错误消息: Visual C++ find line causing "Debug Assertion failed"

我尝试在代码中找到发生这种情况的确切位置,并发现它发生在以下行:

double range=sonar->currentReadingPolar(-50.0,50.0)-300;

我想,一旦我运行程序,错误就会发生,但是我将 cout 行添加到函数中以输出范围,并将它放在一个连续的 while 循环中。令我惊讶的是,该程序实际上可以很好地读取声纳范围而没有任何问题。它在崩溃之前读取了几次,并且在崩溃之前由 cout 正确打印了几次值。所以它并没有像我想象的那样立即崩溃。

那么可能是什么问题?

【问题讨论】:

标签: c++ visual-studio-2012 assertions


【解决方案1】:

我会假设错误消息的意思是它所说的。你试图用迭代器做一些非法的事情。最有可能在它失效或根本没有初始化后取消引用。

这是微软在谈论这些断言https://msdn.microsoft.com/en-us/library/aa985965.aspx

在调试器下运行你的程序,它会在断言处中断,你应该能够准确地看到代码的哪一行失败

您显示的代码中没有任何迭代器,因此我们需要查看更多代码

EDIT - 似乎失败出现在提供的库中。所以让我们假设图书馆工作。因此,失败是由于您没有正确使用它造成的。因此,我的猜测是您的 sonar 值无效。你没有显示任何其他代码,很难说它有什么问题

【讨论】:

  • @pm 100 感谢您的回复 好的我现在做到了 我查看了调用堆栈它说没有为 AriaDebugVC11.dll 加载符号它说迭代器在文件 c:\program files(x86)\ microsoft visual studio 11.0\vc\include\list 但我没有在代码中使用任何迭代器
  • @pm 100 感谢您的回复,代码是正确的,我在 32 位机器上使用 Visual Studio 2008 对其进行了测试,它的代码准确无误。现在,当我将它移至 vs2012 时,它返回此错误发生了我不明白到底是什么问题
猜你喜欢
  • 2016-08-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 2010-11-09
相关资源
最近更新 更多