为什么我的矢量代码断言?无论如何,断言是什么?

3 c++ vector assertions

究竟什么是"断言",或者更具体地说,我如何摆脱错误.当我创建一个指向带有数据成员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,在该页面上搜索无效迭代器.

  • @ D.Shawley:事实并非如此.是的,擦除操作之前的迭代器在之后无效,但擦除返回的迭代器是有效的. (2认同)

Uri*_*Uri 7

断言通常是开发人员为调试和错误控制目的而输入的表达式 - 您在代码中添加了不同的"健全性检查",如果未达到检查,则会使程序崩溃.

例如,假设您的代码将在某个地方划分两个数字.即使你总是期望除以非零,你也可以在除法之前断言,以防参数计算错误.如果断言失败,则意味着在某个地方出现故障.

断言通常只出现在代码中的调试版本中(如果使用visual C++,则可以编译以进行调试和发布).虽然在发布模式下进行编译会消除结果,但这是一个非常糟糕的主意,因为您仍然会出现错误并且结果可能非常糟糕.

在Vector的实现中(某些地方是标准的),特别是在第98行中,有一个断言.如果您可以访问向量代码,请查看断言是什么或调试到那一点.这可能表示向量实现或调用向量的代码中的错误.

你发布的东西给了我们一些关于发生了什么的提示,但是如果你可以粘贴更多的程序,包括定义向量的位置,它会很有用.