究竟什么是"断言",或者更具体地说,我如何摆脱错误.当我创建一个指向带有数据成员int x的类的指针向量,然后执行以下操作:
for(I=antiviral_data.begin();I<antiviral_data.end();I++)
{
if((*I)->x>maxx)
{
antiviral_data.erase(I);
}
}
Run Code Online (Sandbox Code Playgroud)
并运行该程序,我得到没有错误,直到x大于maxx并且我使用.erase(),此时我收到此错误:
调试断言失败!
程序:...我的文档\ O.exe文件:... include\vector行:116
表达式:("this - > _ Has_container()",0)
有关程序如何导致断言失败的信息,请参阅有关断言的Visual C++文档.
(按"重试"调试应用程序)
[中止] [重试] [忽略]
另外,如果我尝试使用cout:
cout<<(*antiviral_data.begin())->x<<endl;
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
调试断言失败!
程序:...我的Documents\O.exe文件:... include\vector Line:98
表达式:矢量迭代器不可分辨
有关程序如何导致断言失败的信息,请参阅有关断言的Visual C++文档.
(按"重试"调试应用程序)
[中止] [重试] [忽略]
有人可以告诉我为什么我不能使用向量中的任何数据,以及如何解决它?
另外:antiviral_data是指针的向量,只有一个元素:
antiviral_data.push_back(new aX1(player.x,player.y,'>'));
Run Code Online (Sandbox Code Playgroud)
如果这有帮助.
pts*_*pts 11
你得到断言的最可能的原因是你在擦除后增加了我.试试这个:
for(I=antiviral_data.begin();I!=antiviral_data.end();)
{
if((*I)->x>maxx) I=antiviral_data.erase(I); else ++I;
}
Run Code Online (Sandbox Code Playgroud)
另请参阅http://www.cppreference.com/wiki/stl/vector/erase,在该页面上搜索无效迭代器.
断言通常是开发人员为调试和错误控制目的而输入的表达式 - 您在代码中添加了不同的"健全性检查",如果未达到检查,则会使程序崩溃.
例如,假设您的代码将在某个地方划分两个数字.即使你总是期望除以非零,你也可以在除法之前断言,以防参数计算错误.如果断言失败,则意味着在某个地方出现故障.
断言通常只出现在代码中的调试版本中(如果使用visual C++,则可以编译以进行调试和发布).虽然在发布模式下进行编译会消除结果,但这是一个非常糟糕的主意,因为您仍然会出现错误并且结果可能非常糟糕.
在Vector的实现中(某些地方是标准的),特别是在第98行中,有一个断言.如果您可以访问向量代码,请查看断言是什么或调试到那一点.这可能表示向量实现或调用向量的代码中的错误.
你发布的东西给了我们一些关于发生了什么的提示,但是如果你可以粘贴更多的程序,包括定义向量的位置,它会很有用.