C++ std::向量超出范围

C++ std::向量超出范围,c++,opengl,vector,standard-library,C++,Opengl,Vector,Standard Library,目前,我正在尝试渲染加载到向量中的.obj模型。我试图将Vector3D对象从阵列中拉出,但它给了我一个超出范围的错误。例如,当数组有12个对象时,它只会在数组崩溃前变为5。下面是渲染的代码 glBegin(GL_TRIANGLE_STRIP); for (int indx = 0; indx < mv3_faces.size(); ++indx) { if (mb_print_once) { std::cout << "Rendering L

目前,我正在尝试渲染加载到向量中的.obj模型。我试图将Vector3D对象从阵列中拉出,但它给了我一个超出范围的错误。例如,当数组有12个对象时,它只会在数组崩溃前变为5。下面是渲染的代码

glBegin(GL_TRIANGLE_STRIP);

for (int indx = 0; indx < mv3_faces.size(); ++indx)
{
    if (mb_print_once)
    {
        std::cout << "Rendering Loop....Faces at 8: " << mv3_faces.at(5).x << " Current Index: " << indx << std::endl;
        std::cout << "Rendering Loop X: " << mv3_faces.at(indx).x << " Y: " << mv3_faces.at(indx).y << " Z: " << mv3_faces.at(indx).z << std::endl;
    }

    glColor4f(1.0f, 1.0f, 0.0f, 1.0f);

    glVertex3f(mv3_vertices.at(mv3_faces.at(indx).x).x, mv3_vertices.at(mv3_faces.at(indx).y).y, mv3_vertices.at(mv3_faces.at(indx).z).z);
}

mb_print_once = false;
glEnd();
glBegin(GL\u三角形\u带);
对于(int indx=0;indxstd::cout我的猜测是异常来自
mv3\u顶点。在调用时:
indx
应该在
mv3\u面的范围内,因为循环是如何形成的,所以它可能是存储在它里面的,它不是
mv3\u顶点的有效索引

如果我是你,我会使用调试器找到异常的确切来源(或者你可以将
glVertex3f(…)
行拆分为多个语句并添加一些日志记录),并跟踪坏数据的来源

glVertex3f(mv3_vertices.at(mv3_faces.at(indx).x).x, mv3_vertices.at(mv3_faces.at(indx).y).y, mv3_vertices.at(mv3_faces.at(indx).z).z);
我怀疑这条线

您是否确保
mv3_面.at(indx).x
?如果这不是真的,那么您将得到超出范围的异常。请检查其他两个面,即
mv3_面.at(indx).y
mv3_面.at(indx).z


无论何时使用函数,请确保传递给
at()
的索引在向量大小的范围内,否则
at()
将抛出一个
超出范围的异常。如果您不能确定,请使用try-catch块处理此异常和程序流的其余部分。

您还记得.OBJ文件中的顶点索引从1开始而不是从0开始吗?因此,从“f”标记读取顶点索引后,必须将顶点索引减1


作为一点评论,我强烈建议使用
[]
而不是
,虽然在本例中这是一个好主意,所以您得到了例外。但一般来说,范围检查开销不值得,尤其是在这样一个高度优化的循环中。

错误对应于哪一行?您确定向量中有12个元素吗?您可以添加
std::cout吗另外,请注意,从代码片段中删除所有不相关的细节被认为是一种良好的礼仪…哪个向量得到了超出范围的错误-面,还是顶点?