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