Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的接收分段错误+;代码 我使用C++、代码::块(启用警告并检查我确认)和SFML。< /P>_C++_Segmentation Fault_Sfml - Fatal编程技术网

C+中的接收分段错误+;代码 我使用C++、代码::块(启用警告并检查我确认)和SFML。< /P>

C+中的接收分段错误+;代码 我使用C++、代码::块(启用警告并检查我确认)和SFML。< /P>,c++,segmentation-fault,sfml,C++,Segmentation Fault,Sfml,我自己也试过寻找这个虫子,但我真的找不到哪里出了问题。我知道segfault是什么意思,但这件事真的让我难堪。我是一个初学者,我可以补充说,但我学习很快 我有一个基本的主类void引擎,它有一个方法void RenderFrame,用于渲染应用程序的每个帧。在所述方法中,我有一个代码,用于将所有瓷砖绘制到renderwindow上: Tile* tile; for (short y = 0; y < mapHeight; ++y) { for (short x = 0; x

我自己也试过寻找这个虫子,但我真的找不到哪里出了问题。我知道segfault是什么意思,但这件事真的让我难堪。我是一个初学者,我可以补充说,但我学习很快

我有一个基本的主类
void引擎
,它有一个方法
void RenderFrame
,用于渲染应用程序的每个帧。在所述方法中,我有一个代码,用于将所有瓷砖绘制到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);
        }
    }
}
应用程序编译得很好,但调用
sprite.SetPosition(x,y)后立即崩溃

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

#0 68701829 sf::Drawable::SetPosition(float, float) () (D:\Coding\C++\sfml\bin\debug\sfml-graphics.dll:??)
#1 004021F9 Tile::Draw(this=0x76ab8cd5, x=0, y=0, pWnd=0x3e3310) (D:\Coding\C++\sfml\include\Tile.cpp:12)
#2 00401D7E Engine::RenderFrame(this=0x3e3298) (D:\Coding\C++\sfml\include\Engine.cpp:106)
#3 00401B29 Engine::MainLoop(this=0x3e3298) (D:\Coding\C++\sfml\include\Engine.cpp:63)
#4 00401E27 _fu0___ZTIPKc(this=0x3e3298) (D:\Coding\C++\sfml\include\Engine.cpp:119)
#5 004022D6 main() (D:\Coding\C++\sfml\Main.cpp:8)
我希望这是足够的信息继续下去,并提前感谢

编辑:哦,这是调试器输出的<代码>程序接收信号SIGSEGV,分段故障。 在sf::Drawable::SetPosition(float,float)()中
没有提供有关问题的更多信息。

回溯中的这一行看起来可疑:

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

这似乎与您的Tile::Draw函数相对应,除了
指针未对齐,这表明它不是有效的指针。因此,您的
std::vector
可能已被损坏。

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

分段错误的一般原因是取消对空指针或无效指针的引用。
1.检查GetTile(),这是导致故障的原因吗?

2.取消引用前,请检查当前级别。

您是否有sf::Drawable::SetPosition的代码?
精灵的定义是什么?调试器不让您看到函数中崩溃的特定行吗?只是好奇:sprite是sprite还是sprite&?如果是第二个,是否有可能您执行了类似于
sprite=*((sprite*)NULL)的操作意外?精灵是否大于tilesize(甚至1像素)?stacktrace似乎与代码不匹配?例如,为什么在调用
SetPosition
之前有一个对
cout
的引用,但没有对显示为代码的
Tile::Draw
方法的引用。David:sf::*来自SFML库,我从中没有任何代码。路易斯库巴尔:雪碧是sf::雪碧雪碧;马蒂:tileSize是32岁,雪碧也没大多少。特洛伊敌人:哦,呜呜,我离开了一个cout进行一些快速测试,但在代码中删除了它。正在以秒为单位更新堆栈跟踪。在此赋值之后将检查空指针。然而,指针可能不是空的,但仍然是无效的!我没有为
std::vector
中的单元格创建默认磁贴,因此它们是。。。空的。通过在每个单元格上创建一个空平铺来修复它。
#1 004021F9 Tile::Draw(this=0x76ab8cd5, x=0, y=0, pWnd=0x3e3310)