1

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

我在这里发布了我的项目的 SVN 工作副本。

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

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

4

3 回答 3

4

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

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

我认为它是段错误,因为当您稍后使用此表面时,由于这条线,您实际上是在 tempSurface 上操作:

surface = tempSurface;

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

于 2008-12-04T19:55:13.447 回答
0

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

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

display = new Surface();

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

然后在 Output::initialize() 你做:

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

这看起来像是 Surface::surface 从未真正初始化过的问题。如果您还没有找到解决方案,当我回到家时,我会深入研究它。

于 2008-12-04T16:53:21.630 回答
0

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

于 2015-02-01T04:25:01.667 回答