c++代码中接收分段错误

Receiving segmentation fault in C++ code

本文关键字:分段 错误 代码 c++      更新时间:2023-10-16

我正在使用c++, code::blocks(启用了警告并检查了以确保)和SFML。

我试着自己去找这个bug,但我真的找不到问题所在。我知道段断层是什么意思,但这个真的把我难住了。我是初学者,但我学得很快。

我有一个基本的主类void Engine,它有一个方法void RenderFrame,渲染应用程序的每一帧。在这个方法中,我有这段代码用来绘制所有的tile到renderwindow上:

Tile* tile;    
for (short y = 0; y < mapHeight; ++y) {
    for (short x = 0; x < mapWidth; ++x) {
        tile    = currentLevel -> GetTile(x, y);
        if (tile) {
            tile -> Draw((x * tileSize), (y * tileSize), Wnd);
        }
    }
}

GetTile方法应该从std::vector<std::vector<Tile *> >中返回一个tile

Draw方法只做这些:

void Tile::Draw(int x, int y, sf::RenderWindow *pWnd) {
    sprite.SetPosition(x, y);
    pWnd -> Draw(sprite);
}

应用程序编译得很好,但是在调用sprite.SetPosition(x, y);

之后就崩溃了

这是来自调试器的完整调用堆栈:

#0 68701829 sf::Drawable::SetPosition(float, float) () (D:CodingC++sfmlbindebugsfml-graphics.dll:??)
#1 004021F9 Tile::Draw(this=0x76ab8cd5, x=0, y=0, pWnd=0x3e3310) (D:CodingC++sfmlincludeTile.cpp:12)
#2 00401D7E Engine::RenderFrame(this=0x3e3298) (D:CodingC++sfmlincludeEngine.cpp:106)
#3 00401B29 Engine::MainLoop(this=0x3e3298) (D:CodingC++sfmlincludeEngine.cpp:63)
#4 00401E27 _fu0___ZTIPKc(this=0x3e3298) (D:CodingC++sfmlincludeEngine.cpp:119)
#5 004022D6 main() (D:CodingC++sfmlMain.cpp:8)

我希望这是足够的信息,提前感谢。

编辑:哦,这是来自调试器的输出。Program received signal SIGSEGV, Segmentation fault. In sf::Drawable::SetPosition(float, float) ()没有给出问题的更多信息

这一行看起来很可疑:

#1 004021F9 Tile::Draw(this=0x76ab8cd5, x=0, y=0, pWnd=0x3e3310) 

这似乎对应于你的Tile::Draw函数,除了this指针不对齐,这表明它不是一个有效的指针。所以也许你的std::vector<std::vector<Tile *> >已经损坏了。

最可能的解释是currentLevel->GetTile(x,y)返回的指针无效。这可能是因为它没有正确初始化(初始化为NUL或一个有效的已分配对象),或者是因为它所引用的对象已被销毁。两者都会解释sprite不是一个有效的对象,并且在该对象上调用SetPosition将传递一个无效的this指针,从而触发SIGSEGV。

段错误的一般原因是对空指针或无效指针的解引用。
1. 检查GetTile()是否导致了错误?
2. 解引用前检查currentLevel