函数调用解决NULL的原因是什么?

时间:2014-08-08 16:53:31

标签: function nullpointerexception linker segmentation-fault call

我的OpenGL程序是在OSX和Ubuntu 14.04的帮助下构建的。它在OSX下运行顺畅,但首先调用GL函数:glDeleteBuffers()导致Linux下的分段错误。在Eclipse-CDT中单步执行反汇编显示:

mov 0x2200df(%rip),%rax        # 0x69a840 <__glewDeleteBuffers>
mov -0x8(%rbp),%rdx
add $0x14,%rdx
mov %rdx,%rsi
mov $0x1,%edi
callq *%rax
    glDeleteBuffers( 1, &normalBufferID );

问题是;跟踪寄存器值显示callq*%rax是对NULL的调用! OpenGL上下文是请求的4.3核心。

在哪种情况下会发生这样的运行时错误?


解决方案:因为我也使用GLFW。我添加了该片段:

if (glewInit() != GLEW_NO_ERROR)
{
    cout << "Failed to initialize GLEW... " << endl; 
    return -1;
}

glfwInit()之后。

1 个答案:

答案 0 :(得分:1)

我假设您正在使用代码段中的GLEW__glewDeleteBuffers) - 您在调用任何OpenGL函数之前是否正在调用glewInit()?这样做会从OpenGL上下文中加载适当的OpenGL函数指针。忘记这是我将OpenGL函数指针设为null(在Windows和Linux上)的唯一方法。请参阅this tutorial under "Function Loading" for more details

According to this answer on another question OSX并不需要glewInit()因为OpenGL是OSX的核心部分(我没有经验),这可以解释为什么你不会在OSX上崩溃

Here is the GLEW documentation that goes over calling and checking the result of glewInit()