2008-12-04 72 views
1

好的 - 我在这里有一个有趣的。我正在研究俄罗斯方块克隆(基本上是为了“升级”我的技能)。我试图重构我的代码,使其以我想要的方式抽象出来。虽然之前的工作状况很好,但现在我在任何图像都可能丢失之前出现分割错误。我试过调试它无济于事。使用SDL与C++,尝试Blit图像的分段错误

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

这只是一个小项目,有人比我更多的知识和良好的调试器可能会弄清楚的一个单元。唯一的依赖是SDL。可以告诉我我做错了什么的人的荣誉。

编辑:据我所知道的,我现在有什么我以前在逻辑上是相同的,所以我不认为我现在已经会导致段错误。只要运行一个SVN的工作副本恢复,重新编译,你可以看到它的工作...

+0

你或许应该张贴堆栈跟踪,无论是从核心文件或在调试器中运行它。 – 2008-12-04 16:26:03

+0

不幸的是,工作副本的原始链接不可用(我的母校很酷,显然删除了这样的tarballs)。我会看看我是否可以在旧硬盘上找到代码的副本,并建立更永久的链接。 – 2012-04-02 13:56:55

回答

4

看15行Surface.cpp的18:

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

我相信它出现segfaults因为当您以后使用此面时,实际上是在tempSurface操作,因为这行:

surface = tempSurface; 

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

0

我没有在我的机器上安装了SDL,而是通过代码照看。

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

display = new Surface(); 

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

然后在输出:: initalize()你这样做:

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

这看起来像这个问题表面::表面从来没有真正初始化。如果你还没有找到解决方案,当我回到家时,我会发现它。

+0

这应该没问题,因为SDL_SetVideoMode(...)将创建并初始化屏幕表面,然后将指针传递回display-> surface – Dan 2008-12-04 17:45:07

0

据我了解,分段错误发生在你试图mnaipulate一个ponter它不再可用,或者你正在试图改变一个恒定的值。