【问题标题】:Why is my C++ object causing segmentation fault?为什么我的 C++ 对象会导致分段错误?
【发布时间】:2014-07-15 03:37:39
【问题描述】:

所以我正在用 C++ 开发一个 3D 游戏引擎/api。但是我遇到了一个我以前从未真正遇到过的错误。分段错误,现在通过一些研究,我能够理解这是什么(或者至少我认为我做到了,也许我不理解它,这就是我继续出错的原因)。无论如何,当我尝试使用我的指针对象时,它会因该错误而崩溃:

void RenderEngine::Render(GameObject* object)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    std::cout << "debug 1\n"; //this prints
    object->RenderAll(m_defaultShader, this); //segmentation fault occurs here
    std::cout << "debug 2\n"; //this does not get printed
...more code...
}

我用这个引用那个函数/方法:

void Game::Render(RenderEngine* renderEngine)
{
    renderEngine->Render(&m_root);  //m_root is declared as 'GameObject m_root;'
}

我已经检查了 m_root 是否为空,它不是! 这也是我第一次使用 StackOverflow,所以如果格式化或有什么奇怪的地方,我深表歉意。

如果有人可以帮助我理解为什么我正在做的事情不起作用,那将是挽救生命。如果它与我的操作系统或编译器有任何关系,我在 Linux Mint 上使用 Code::Blocks 和 GNU GCC 编译器。

编辑:

所以在进一步调试和更多地因为我是一个假人而拍打我的头之后,我意识到我没有正确初始化我的游戏,所以我添加了那个函数调用,现在这就是发生崩溃的地方:

引擎构造函数:

Engine::Engine(int width, int height, double framerate, Game* game) :
    m_running(false),
    m_width(width),
    m_height(height),
    m_frameTime(1.0 / framerate),
    m_game(game),
    m_renderEngine(NULL)
{
    m_game->SetEngine(this);
}

m_game->Init() 在循环中被调用:

...code
        printf("%s\n", "sef"); //prints
        m_game->Init();   //segmentation fault crash
        printf("%s\n", "s324"); //does not print
...code

主要功能:

int main()
{
    Test game;
    Engine engine(800, 600, 60, &game);
    engine.CreateWindow("Boss3D Engine");
    engine.Start();
    return 0;
}

这里是 Start 和 CreateWindow 函数:

void Engine::Start()
{
    if(m_running) return;
    Run(); // this contains the game loop of the engine, the first lines set m_running to true, then try to call the m_game->Init like above, so it doesn't even complete one iteration
}

void Engine::CreateWindow(const std::string& title)
{
    SDL_Init(SDL_INIT_EVERYTHING);

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,32);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,16);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);

    SDLCreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, false);

    GLenum res = glewInit();
    if(res != GLEW_OK)
    {
        fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
    }

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    glFrontFace(GL_CW);
    glCullFace(GL_BACK);
    glEnable(GL_CULL_FACE);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_DEPTH_CLAMP);

}

SDLCreateWindow:

void SDLCreateWindow(const char* title, int x, int y, int width, int height, bool fullscreen)
{
    int mode = 0;

    if(fullscreen)
        mode = SDL_WINDOW_FULLSCREEN;

    window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL | mode);
    glContext = SDL_GL_CreateContext(window);

    //SDL_SetHint(SDL_HINT_RENDER_VSYNC, "1");
    SDL_GL_SetSwapInterval(1);
}

我使用了 valgrind 工具并将结果放入一个文本文件中,但是它太长了以至于我无法粘贴到任何地方,而且我以前从未使用过 valgrind,所以我不确定如何解释结果,这里是文件:valgrind file

在放置许多打印件几个小时后,我发现这是它现在真正崩溃的地方:

inline void AddLight(BaseLight* light)
{
    std::cout << "adding a light\n";
    std::cout << light << std::endl;
    //crash right below this line
    std::cout << "m_lights size: " << m_lights.size() << std::endl; //not printed
    m_lights.push_back(light);
    std::cout << "New m_lights size: " << m_lights.size() << std::endl;
}

此函数在第一次尝试使用时崩溃,m_lights 声明为:std::vector&lt;BaseLight*&gt; m_lights;

【问题讨论】:

  • 为了将来参考,请不要将您的 C++ 问题标记为 C。(另外,欢迎来到 Stack Overflow!)
  • 当你只做*object 时会出现段错误吗?您是否使用调试器检查了 object 以确保它不仅仅是垃圾?
  • @Cornstalks ,我不是已经在使用 *object 了吗?还是我误会了你?抱歉,我对 Code::Blocks 还是有点陌生​​,我曾经是 VS 的 Windows 开发人员。如何使用调试器对其进行检查?
  • 确保所有变量都有其预期值。使用调试器来检查。如果在您指示的行发生崩溃,thisobject 必须是无效指针。
  • m_root 的类型是什么?它的值是如何初始化/设置的?

标签: c++ memory segmentation-fault


【解决方案1】:

供将来参考的解决方案:为什么会影响它我不太确定,但是我通过几个小时的调试和更改用于编译代码的终端命令解决了这个问题,我现在使用gnome-terminal --disable-factory -t $TITLE -x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 2021-07-18
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多