2008-12-04 73 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它不再可用,或者你正在試圖改變一個恆定的值。