使用SDL和C ++进行分段错误,尝试Blit图像

时间:2008-12-04 16:20:35

标签: c++ sdl

好的 - 我在这里有一个有趣的。我正在研究一个俄罗斯方块克隆(基本上是为了“升级”我的技能)。我试图重构我的代码,以我想要的方式抽象它。虽然它之前工作得很好,但现在我在任何图像可以被blit之前出现分段错误。我试过调试它无济于事。

我已发布项目here的SVN工作副本。

这只是一个小项目,而且比我更有知识的人和一个好的调试器可能会很快解决它。唯一的依赖是SDL。感谢那些可以告诉我自己做错了什么的人。

编辑:据我所知,我现在所拥有的和以前所拥有的在逻辑上是一样的,所以我不认为我现在所拥有的会导致分段错误。只需在工作副本上运行一个svn revert,重新编译就可以看到它正在工作......

3 个答案:

答案 0 :(得分:4)

查看Surface.cpp的第15至18行:

    surface = SDL_DisplayFormatAlpha( tempSurface );
    surface = tempSurface;
}
SDL_FreeSurface( tempSurface );

我认为它是段错误的,因为当你稍后使用这个表面时,你实际上是因为这行而在tempSurface上运行:

surface = tempSurface;

而不是SDL_DisplayFormatAlpha()返回的曲面。由于你释放了tempSurface,surface现在指向无效的内存。要修复,只需删除else块中的第二行。

答案 1 :(得分:0)

我的机器上没有安装SDL,但查看了代码后。

我在Output.cpp文件中注意到了这一点:

display = new Surface();

你什么都不做。这个的构造函数是空的。 (表面未初始化)。

然后在Output :: initalize()中执行:

display->surface = SDL_SetVideoMode( 800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF );

这看起来像Surface :: surface从未实际初始化过。如果你还没有找到解决方案,当我回到家时,我会深入了解它。

答案 2 :(得分:0)

据我了解,当您尝试使用不再可用的ponter时,或者您尝试更改常量值时会发生分段错误。