GLFW3 and GLEW32: 0xC0000005: Access violation executing location

2

I have installed all of the libraries like glfw and glew.

When I run the following code I get an error from the line glGenVertexArrays(1, &VertexArrayID); complaining about Access violation. I know this error is caused by a NULL pointer, but my GLuint shouldn't be.

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <gl/GL.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

static const GLfloat g_vertex_buffer_data[] = {
    -1.0f,-1.0f,-1.0f, // triangle 1 : begin
    -1.0f,-1.0f, 1.0f,
    -1.0f, 1.0f, 1.0f, // triangle 1 : end
    1.0f, 1.0f,-1.0f, // triangle 2 : begin
    -1.0f,-1.0f,-1.0f,
    -1.0f, 1.0f,-1.0f, // triangle 2 : end
    1.0f,-1.0f, 1.0f,
    -1.0f,-1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f, 1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f, 1.0f, 1.0f,
    -1.0f, 1.0f,-1.0f,
    1.0f,-1.0f, 1.0f,
    -1.0f,-1.0f, 1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f, 1.0f, 1.0f,
    -1.0f,-1.0f, 1.0f,
    1.0f,-1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f, 1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f,-1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f,-1.0f,
    -1.0f, 1.0f,-1.0f,
    1.0f, 1.0f, 1.0f,
    -1.0f, 1.0f,-1.0f,
    -1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    -1.0f, 1.0f, 1.0f,
    1.0f,-1.0f, 1.0f
    };
static const GLfloat g_color_buffer_data[] = {
    0.583f,  0.771f,  0.014f,
    0.609f,  0.115f,  0.436f,
    0.327f,  0.483f,  0.844f,
    0.822f,  0.569f,  0.201f,
    0.435f,  0.602f,  0.223f,
    0.310f,  0.747f,  0.185f,
    0.597f,  0.770f,  0.761f,
    0.559f,  0.436f,  0.730f,
    0.359f,  0.583f,  0.152f,
    0.483f,  0.596f,  0.789f,
    0.559f,  0.861f,  0.639f,
    0.195f,  0.548f,  0.859f,
    0.014f,  0.184f,  0.576f,
    0.771f,  0.328f,  0.970f,
    0.406f,  0.615f,  0.116f,
    0.676f,  0.977f,  0.133f,
    0.971f,  0.572f,  0.833f,
    0.140f,  0.616f,  0.489f,
    0.997f,  0.513f,  0.064f,
    0.945f,  0.719f,  0.592f,
    0.543f,  0.021f,  0.978f,
    0.279f,  0.317f,  0.505f,
    0.167f,  0.620f,  0.077f,
    0.347f,  0.857f,  0.137f,
    0.055f,  0.953f,  0.042f,
    0.714f,  0.505f,  0.345f,
    0.783f,  0.290f,  0.734f,
    0.722f,  0.645f,  0.174f,
    0.302f,  0.455f,  0.848f,
    0.225f,  0.587f,  0.040f,
    0.517f,  0.713f,  0.338f,
    0.053f,  0.959f,  0.120f,
    0.393f,  0.621f,  0.362f,
    0.673f,  0.211f,  0.457f,
    0.820f,  0.883f,  0.371f,
    0.982f,  0.099f,  0.879f
};


GLFWwindow* GLFWInit()
{
    if (!glfwInit())
    {
        fprintf(stderr, "Failed to initialize GLFW\n");
    }
    glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // We want OpenGL 3.3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // We don't want the old OpenGL
    GLFWwindow* window; // (In the accompanying source code, this variable is global for simplicity)
    window = glfwCreateWindow(1024, 768, "Tutorial 01", NULL, NULL);
    glewExperimental = GL_TRUE;
    // Initialize GLEW to setup the OpenGL Function pointers
    glewInit();
    if (window == NULL) {
        printf("Failed to create window context.\n");
    }
    glfwMakeContextCurrent(window); // Initialize GLEW
    return window;
}


int main()
{
    GLFWwindow* window = GLFWInit();

    //vertex shader ID array setup:
    
    GLuint VertexArrayID;
    glGenVertexArrays(1, &VertexArrayID);
    glBindVertexArray(VertexArrayID);
    // some other code

    while (!glfwWindowShouldClose(window)) {
        // wipe the drawing surface clear
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        // update other events like input handling 
        glDrawArrays(GL_TRIANGLES, 0, 12 * 3); // 12*3 indices starting at 0 -> 12 triangles -> 6 squares
        glfwPollEvents();
        // put the stuff we've been drawing onto the display
        glfwSwapBuffers(window);
        
    }
    glfwTerminate();
    return 0;
}

I've looked at other similar questions, and I added the following to my code to no avail.

glewExperimental = GL_TRUE;
glewInit();

Here are the specifications of my machine (if it helps):

  • It runs on MS Windows 10.
  • My IDE is Visual Studio 2019
  • All of the libraries are installed correctly.
c++
c
opengl
glfw
glew
asked on Stack Overflow Jul 17, 2020 by sciencepiofficial • edited Jul 17, 2020 by genpfault

2 Answers

3

It was a simple mistake all along - in my GLFWInit function, the following lines were called before the window was actually created.

glewExperimental = GL_TRUE;
glewInit();

Putting those lines before the return window but after glfwMakeContextCurrent(window) makes it work perfectly now. Thank you for your help.

answered on Stack Overflow Jul 17, 2020 by sciencepiofficial • edited Jul 18, 2020 by Will-of-fortune
1

The order of window creation, context activation and extension loading is wrong.

In your code you first attempt creating the window, then without checking for success you attempt to load extensions (without having a context active in the first place) and then do the context activation. *Except for the window creation you have everything backwards.

Your code crashes, because you attempt to load the OpenGL extensions without the context being active on the current thread. Without an active context you can't load extensions. On Microsoft Windows the addresses of the loaded extensions are specific to each context so strictly speaking on Windows you must do extension loading for each individual context you create!

But without a context active, extension loading fails and the pointers for the functions remain uninitialized or set to nullpointer. Hence the crash when calling them.

The proper order is

// Create window and check for failure
GLFWwindow *const window = glfwCreateWindow(
    1024, 768,
    "Tutorial 01",
    NULL, NULL );
if( !window ){
    printf("Failed to create window context.\n");
    return NULL;
}

// activate context on current thread
glfwMakeContextCurrent(window);

// Initialize GLEW
glewExperimental = GL_TRUE;
glewInit();
answered on Stack Overflow Jul 17, 2020 by datenwolf

User contributions licensed under CC BY-SA 3.0