尝试在方法中包装GlgenVertexArray调用时出现分段错误 我试图在Mac OS上使用SDL 2.0.3和C++的“现代”OpenGL(3 +),如果我直接调用OpenGL函数,它就可以工作,但是一旦我试图把它封装在一个类中,它就不起作用了。更具体地说,我想将顶点数组对象存储为类成员,并在其上的类方法中调用glgenvertexarray,但这会导致segfault

尝试在方法中包装GlgenVertexArray调用时出现分段错误 我试图在Mac OS上使用SDL 2.0.3和C++的“现代”OpenGL(3 +),如果我直接调用OpenGL函数,它就可以工作,但是一旦我试图把它封装在一个类中,它就不起作用了。更具体地说,我想将顶点数组对象存储为类成员,并在其上的类方法中调用glgenvertexarray,但这会导致segfault,c++,macos,opengl,opengl-3,sdl-2,C++,Macos,Opengl,Opengl 3,Sdl 2,直接调用的最小工作示例(没有任何用处,但不会崩溃): #包括 #包括 #包括 int main() { SDL_Init(SDL_Init_视频); SDL_窗口*sdlWindow=SDL_创建窗口( “OpenGL工作”, SDL_窗口位置居中, SDL_窗口位置居中, 640, 480, SDL_WINDOW_OPENGL|SDL_WINDOW_ALLOW_HIGHDPI ); SDL_GLContext sdlGLContext=SDL_GL_CreateContext(sdlWindo

直接调用的最小工作示例(没有任何用处,但不会崩溃):

#包括
#包括
#包括
int main()
{
SDL_Init(SDL_Init_视频);
SDL_窗口*sdlWindow=SDL_创建窗口(
“OpenGL工作”,
SDL_窗口位置居中,
SDL_窗口位置居中,
640,
480,
SDL_WINDOW_OPENGL|SDL_WINDOW_ALLOW_HIGHDPI
);
SDL_GLContext sdlGLContext=SDL_GL_CreateContext(sdlWindow);
无符号整数vertexArrayObject;
//这很有效
GLGEnVertexArray(1和vertexArrayObject);
//请等待几秒钟,然后关闭窗口
SDL_延迟(3000);
SDL_GL_DeleteContext(sdlGLContext);
SDL_窗口(sdlWindow);
返回退出成功;
}
使用简单类无法工作(分段错误):

#包括
#包括
#包括
#包括
类图形
{
公众:
void createVAO();
私人:
无符号整数vertexArrayObject;
};
void Graphics::createVAO()
{
glgenvertexarray(1,&this->vertexArrayObject);
}
int main()
{
SDL_Init(SDL_Init_视频);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,2);
SDL_窗口*sdlWindow=SDL_创建窗口(
“OpenGL狗屎”,
SDL_窗口位置居中,
SDL_窗口位置居中,
640,
480,
SDL_WINDOW_OPENGL|SDL_WINDOW_ALLOW_HIGHDPI
);
SDL_GLContext sdlGLContext=SDL_GL_CreateContext(sdlWindow);
std::唯一的\u ptr g;
g->createVAO();
//请等待几秒钟,然后关闭窗口
SDL_延迟(3000);
SDL_GL_DeleteContext(sdlGLContext);
SDL_窗口(sdlWindow);
返回退出成功;
}
glGenBuffers
也会发生同样的情况。我想知道这只是因为我的C++技巧的不足,还是因为它是一个与OpenGL和/或SDL相关的更严重的问题C++问题。我发现很多关于堆栈溢出的问题都有类似的症状,但大多数问题都是由于缺少选项
glewExperimental=GL\u TRUE对于我根本没有使用的GLUT或GLEW,或者我缺少的OpenGL上下文,因为我能够在屏幕上绘制:

我希望有人能解释为什么会崩溃,因为我不能:(


我使用的是Mac OS 10.9.3,编译器是苹果LLVM版本5.1(clang-503.0.40)(基于LLVM 3.4svn)
这是编译器调用:
c++-o OpenGLTest main.cpp-I/usr/local/include/SDL2-lSDL2-framework OpenGL
这个->vertexArrayObject的意义是什么?只要使用
和vertexArrayObject
@BrettHale我喜欢这个符号来表明它是一个成员,比使用带下划线的前缀要好得多<代码>m ;)
std::unique_ptr<Graphics> g;
g->createVAO();
#include <cstdlib>
#include <memory>
#include <SDL.h>
#include <OpenGL/gl3.h>

class Graphics
{
    public:
        void createVAO();

    private:
        unsigned int vertexArrayObject;
};

void Graphics::createVAO()
{
    glGenVertexArrays(1, &this->vertexArrayObject);
}

int main()
{
    SDL_Init(SDL_INIT_VIDEO);

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

    SDL_Window *sdlWindow = SDL_CreateWindow(
        "OpenGL Shit",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        640,
        480,
        SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI
    );
    SDL_GLContext sdlGLContext = SDL_GL_CreateContext(sdlWindow);

    std::unique_ptr<Graphics> g;

    g->createVAO();

    // Wait some seconds before closing the window
    SDL_Delay(3000);

    SDL_GL_DeleteContext(sdlGLContext);
    SDL_DestroyWindow(sdlWindow);

    return EXIT_SUCCESS;
}
std::unique_ptr<Graphics> g;
g->createVAO();
std::unique_ptr<Graphics> g( new Graphics );