Исключение, выданное в 0x00000000 в Project0_opengl.exe: 0xC0000005: расположение выполнения нарушения прав доступа 0x00000000

Если у вас есть базовый класс A и производный класс B, вы можете сделать следующее.

void wantAnA(A myA)
{
   // work with myA
}

B derived;
// work with the object "derived"
wantAnA(derived);

Теперь для метода wantAnA нужна копия derived , Однако объект derived не может быть полностью скопирован, так как класс B может изобретать дополнительные переменные-члены, которые не находятся в его базовом классе A.

Поэтому, чтобы вызвать wantAnA, компилятор будет «срезать» все дополнительные члены производного класса. Результатом может быть объект, который вы не хотите создавать, потому что

  • он может быть неполным,
  • ведет себя как объект A (все особые поведения класс B теряется).
1
задан Alex Babayan 24 March 2019 в 14:38
поделиться

1 ответ

glewInit() должен вызываться после того, как контекст OpenGL становится актуальным, после glfwMakeContextCurrent .
Но он должен вызываться перед любой инструкцией OpenGL. См. Также Инициализация GLEW :

// [...]

/* Make the window's context current */
glfwMakeContextCurrent(window);

glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
    printf("Error\n");

float pos[6] = {
    -0.5f, -0.5f,
     0.0f,  0.5f,
     0.5f, -0.5f
};

GLuint buf;
glGenBuffers(1, &buf);
glBindBuffer(GL_ARRAY_BUFFER, buf);
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), pos, GL_STATIC_DRAW);

// [...]

Обратите внимание, что инструкции, подобные glGenBuffers, являются функциональными указателями. Эти указатели инициализированы в NULL. glewInit() присваивает адрес функции этим указателям.
Когда вы пытаетесь вызвать функцию перед инициализацией, это вызывает:

Нарушение прав доступа, местоположение выполнения 0x00000000

0
ответ дан Quimby 24 March 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: