为什么我的c++对象导致分割错误

Why is my C++ object causing segmentation fault?

本文关键字:分割 错误 对象 我的 c++ 为什么      更新时间:2023-10-16

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

void RenderEngine::Render(GameObject* object)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    std::cout << "debug 1n"; //this prints
    object->RenderAll(m_defaultShader, this); //segmentation fault occurs here
    std::cout << "debug 2n"; //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("%sn", "sef"); //prints
        m_game->Init();   //segmentation fault crash
        printf("%sn", "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文件

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

inline void AddLight(BaseLight* light)
{
    std::cout << "adding a lightn";
    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<BaseLight*> m_lights;

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