为什么我的c++对象导致分割错误
Why is my C++ object causing segmentation fault?
所以我正在用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
- C++映射分割错误(核心转储)
- 由cin中的字符串中未捕获空白引起的分割错误
- 删除映射和分割错误中的一个过去结束元素
- 在指向函数中读取变量时出现分割错误
- 在链表中的第 n 位插入显示分割错误
- 较高值 n 的分割错误(例如 n=999997)
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 分割错误:向量中的擦除功能
- 向量向量的分割错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 分割错误 11:尝试使用 cin 输入 B[1] 时
- 集合布局上的 Qt 分割错误
- 高达20亿的筛子会产生分割错误
- 对向量使用推回函数时的分割错误
- 绘制精灵会导致分割错误
- 将矢量的整数内容打印为字符串会导致分割错误
- 分割错误:使用向量时为 11 c++
- 结构的分割错误错误