OCTREE.exe中0x1000bbae处未处理的异常:0xC0000005:写入位置0x000000a8时发生访问冲

Unhandled exception at 0x1000bbae in OCTREE.exe: 0xC0000005: Access violation writing location 0x000000a8

本文关键字:0x000000a8 位置 访问 0xC0000005 0x1000bbae exe 未处理 异常 OCTREE      更新时间:2023-10-16

我在下面的代码行中得到了上面的运行时错误:

glutMainLoop(); 

为什么?

#include <stdio.h>
#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cassert>
#include <math.h>
#include <gl/glut.h>
#include <stdlib.h>
class Vertex {
public: float X;
        float Y;
        float Z;
public: Vertex (float first, float second, float third){
            X=first;
            Y=second;
            Z=third;
        }
};

using namespace std;
vector <Vertex> vertexCoordinates;
vector <vector<int>> faces;
vector <vector<float>> faceNormals;
vector <vector<float>> faceCenters;
void loadOff(string inputFileName) {

    int vertexCount; int faceCount; int edgeCount;
    ifstream inputFileStream;
    inputFileStream.open(inputFileName.data());
    assert(inputFileStream.is_open());
    string actualLine;
    inputFileStream>>vertexCount;
    inputFileStream>>faceCount;
    inputFileStream>>edgeCount;

    for (int loadVertexIndex=0; loadVertexIndex<vertexCount; loadVertexIndex++){

        float X;
        float Y;
        float Z;
        inputFileStream>>(float)X;
        inputFileStream>>(float)Y;
        inputFileStream>>(float)Z;
        vertexCoordinates.push_back(Vertex(X,Y,Z));
        if(inputFileStream.eof())break;
    }
    for (int faceIndex=0; faceIndex<=faceCount; faceIndex++){ //<= faceCount?
      string line;
      getline(inputFileStream, line);
      istringstream actualLineStream(line);

      std::vector<int> face((std::istream_iterator<int>(actualLineStream)),
      std::istream_iterator<int>());

      faces.push_back(face);

    }//end for faceCount
}
void display(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);

    glutSwapBuffers();
    glutPostRedisplay();

}

void init(){
    //loadOff("spider.off");
    //BLACK BACKGROUND
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glEnable(GL_DEPTH_TEST);
    glPolygonMode(GL_BACK, GL_LINE);
    glPolygonMode(GL_FRONT, GL_LINE);
}

void reshape(int w, int h) {

    glViewport (0,0,(GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluLookAt(0.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f);
    glMatrixMode(GL_MODELVIEW);
}
void keyboard (unsigned char key, int x, int y){
}
void specialKeys(int key, int x, int y) {
}

int main(int argc, char *argv[]){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH );
    glutInitWindowSize(800,600);
    init();
    glutDisplayFunc(display);

    glutMainLoop();
    return 0;
}

您在0x000000a8处尝试写入时遇到异常。发生的情况是,您的代码或openGL在某个地方接收到的是空指针,而不是有效指针。有问题的代码正试图以该指针的168(0xa8)偏移量更新某些内容。

我已经7年没有使用GLUT了,所以对我的答案持保留态度。也就是说,你的init()函数让我有点担心。我认为在编写GLUT程序时,应该只在GLUT回调函数中发出OpenGL命令。我不确定在执行init()函数时是否存在活动的OpenGL上下文。如果删除对init()的调用,程序会崩溃吗?