C++ gldrawArray上的OpenGL分段错误处理

C++ gldrawArray上的OpenGL分段错误处理,c++,opengl,segmentation-fault,C++,Opengl,Segmentation Fault,我正在用OpenGL在Windows上用Code::Blocks(C++)和MinGW制作一个游戏。所有的绘图和逻辑都很好,游戏非常完美。直到,突然,它没有。经过一段随机的时间后,游戏会出错。与GL SEGFULTS的典型情况一样,堆栈跟踪没有帮助。我得到的唯一一件事是,segfault发生在供应商的OpenGL实现中。我已经在不同厂商的多个显卡上测试过了,他们都这么做了,所以问题就在我这边 我通过gDEBugger运行了这个程序,得到了同样的无用堆栈跟踪。哈哈,我也用了GLIntercept,

我正在用OpenGL在Windows上用Code::Blocks(C++)和MinGW制作一个游戏。所有的绘图和逻辑都很好,游戏非常完美。直到,突然,它没有。经过一段随机的时间后,游戏会出错。与GL SEGFULTS的典型情况一样,堆栈跟踪没有帮助。我得到的唯一一件事是,segfault发生在供应商的OpenGL实现中。我已经在不同厂商的多个显卡上测试过了,他们都这么做了,所以问题就在我这边

我通过gDEBugger运行了这个程序,得到了同样的无用堆栈跟踪。哈哈,我也用了GLIntercept,但什么都没跳出来。因此,我开始手动查找segfault(BuGLe拒绝编译…),并基本上将跟踪消息写入日志。我已经把范围缩小到一个对glDrawArrays的调用。我在互联网上做了很多探索,并尝试了很多我发现的修复方法

因为这个游戏不是为便携性编写的,所以我一直在犹豫是否在wine and valgrind中运行它。在我开始处理这些乱七八糟的事情之前,如果你能看看我的代码并找出错误,我将不胜感激。(我相信这是显而易见的…)

(注意:为了可读性,我删除了所有跟踪行)

有趣的是,这段代码是有效的。。。有一段时间。我已经打印了所有变量的值,它们都是正确的,指针不是空的,整个代码中间隔的glGetError调用总是不返回任何错误。坦率地说,我很茫然


任何建议我做一些不同的事情的人都要注意:我需要使用顶点数组来支持传统(1.4)GL实现,我将数组声明为指针,以便(将来)可以(在一次中)重用它们来绘制多个原语(例如,排气从船上排出)

GLDrawArray的最后一个参数应该是4(元素数),而不是12(浮动数)


您正在尝试绘制12个元素(=36个浮动),并通过数组的边界进行访问。

Wow.我觉得很愚蠢。你知道为什么会有一段时间呈现为OK,然后seg'd?可能只有在内存区域中有其他东西试图访问时才会出现SEGFULT。如果是空闲空间,内存边界检查可能没有注意到。这可以解释它的随机性。有意义e因为它在内存较少的系统上故障更快…多亏了你,我可以睡得更安稳…至少今晚是这样。还是这样吗?文档中说,
count
是“要渲染的索引数”
void PlayerShip::Render()
{
    glPushMatrix(); //Save the current state

    glTranslatef(m_PosX, m_PosY, 0);
    glRotatef(vect.Rotation - 90, 0, 0, 1); //Matrixes are applied in reverse order


    double xl = m_SizeX / 2, yl = m_SizeY / 2; //Get values to add/subract to the midpoint for the corners
    glEnable(GL_TEXTURE_2D); //Redundant
    TextureManager::Inst()->BindTexture(TexIDs::Playership01); //Bind the texture

    glEnableClientState(GL_VERTEX_ARRAY); //These enables and disables are redundant here
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);

    GLdouble* Verts;
    Verts = new GLdouble[12] { -xl, -yl, -.5,    xl, -yl, -.5,
                           xl,  yl, -.5,    -xl, yl, -.5}; //Calculate quad vertices
    GLdouble* Texs;
    Texs = new GLdouble[8] {0, 0,    1, 0,   1, 1,    0, 1}; //Calculate texture vertices

    glVertexPointer(3, GL_DOUBLE, 0, Verts);
    glTexCoordPointer(2, GL_DOUBLE, 0, Texs);

    glDrawArrays(GL_QUADS, 0, 12);

    delete [] Verts;
    delete [] Texs;

    glPopMatrix();
}