std::string 的声明导致 OpenGL 出现分段错误

Posted

技术标签:

【中文标题】std::string 的声明导致 OpenGL 出现分段错误【英文标题】:Declaration of std::string causes a segmentation fault with OpenGL 【发布时间】:2015-06-20 04:15:17 【问题描述】:

考虑一个非常简单的 OpenGL 程序:

#include <GL/glut.h>

static void RenderScene()

    glClear(GL_COLOR_BUFFER_BIT);
    glutSwapBuffers();


int main(int argc, char** argv)

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize(500, 500);
    glutCreateWindow("OpenGL Test");
    glutDisplayFunc(RenderScene);
    glClearColor(0.3f, 0.3f, 0.3f, 0.0f);
    glutMainLoop();

    return 0;

这编译并运行良好,按预期显示灰色窗口。

然后,在 OpenGL 处理之前,我在 main 函数中引入了三个变量。代码变为:

#include <string>
#include <GL/glut.h>


static void RenderScene()

    glClear(GL_COLOR_BUFFER_BIT);
    glutSwapBuffers();



int main(int argc, char** argv)

    int x = 5;
    char y = 'a';
    std::string z = "abc";

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize(500, 500);
    glutCreateWindow("OpenGL Test");
    glutDisplayFunc(RenderScene);
    glClearColor(0.3f, 0.3f, 0.3f, 0.0f);
    glutMainLoop();

    return 0;

编译这很好,但如果我运行它,我会收到分段错误错误。现在,如果我注释掉 std::string z = "abc"; 行,那么它运行良好,没有任何错误。

因此,由于某种原因,在这里声明字符串变量会导致分段错误,但不会导致任何其他变量类型。

如果我删除所有 OpenGL 代码,那么它运行良好。但是如果我把除了一行之外的所有OpenGL代码都去掉了,比如glutInit(&amp;argc, argv);,那么还是会导致分段错误。

有什么想法吗?

【问题讨论】:

我曾经遇到过类似的问题。我发现添加 g​​lutGet(GLUT_DISPLAY_MODE_POSSIBLE) (如果返回 false 则退出)有帮助。感觉 glutGet() 正在执行一些必要的初始化。但我始终无法真正追查并证明这一点。 您是否使用命令行参数调用? 包括编译器名称、版本和平台 还在这里查看您的其他可能相关的问题:***.com/questions/30949880/…,您的系统上的标准 C++ 库似乎有问题。也许您包含的标头和链接/加载的库不匹配,或者这种风格的东西。 好像是重复的:***.com/questions/31579243/… 【参考方案1】:

我也有类似的问题,但我的是在 Linux 上。你是在 Linux 还是 Windows 上?有没有安装显卡驱动?

就我而言,我在安装了nVidiaUbuntu 上运行,我注意到当我将我的程序与位于/usr/lib/x86_64-linux-gnulibGL.so 链接时,它会导致分段错误。然后我还发现有另一个libGL.so位于/usr/lib/nvidia-352,这将链接而不会崩溃。

希望对您有所帮助。

【讨论】:

以上是关于std::string 的声明导致 OpenGL 出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

std::string::erase 导致内存损坏

为啥创建静态 const std::string 会导致异常?

为啥创建静态 const std::string 会导致异常?

是啥导致 c++ std::string 变量在传递给类时给出冲突的定义

声明对对象和赋值运算符的引用

为什么“auto”将字符串声明为const char *而不是std :: string?