[英]C++ SDL Segmentation fault (core dumped)
我目前正在學習使用C ++作為基本編程語言時,如何在SDL上進行編碼。
因此,基本上,發生的是,我有一段包含循環的代碼,它將顯示圖像,直到循環再次開始。 循環的長度為5秒,程序的迭代器i設置為0,並且每次循環都增加,直到迭代器5通過中斷退出循環為止,迭代器達到5。 然后,SDL按預期方式退出,程序完成運行。
沒有編譯錯誤,只有FYI。 當我運行該程序時,主循環將運行一次,然后程序會自行關閉它,並在“終端”窗口上打印一條消息,指出“分段錯誤(核心已轉儲)”。
這是什么意思,怎么辦才能使它不發生呢? 提前致謝。
編輯:代碼是這一,對不起之前沒有寫過。 我正在記憶中編寫它,因為我現在不在家。
#include <iostream>
#include <SDL.h>
int main( int argc, char** argv )
{
SDL_Surface* media;
SDL_Surface* window;
int i = 0;
SDL_Init( SDL_INIT_EVERYTHING );
window = SDL_SetVideoMode( 1920, 1080, 32, SDL_SWSURFACE );
media = SDL_LoadBMP( "xD.bmp" );
while( true )
{
SDL_BlitSurface( media, NULL, window, NULL );
SDL_Delay( 5000 );
if( i == 5 )
{
break;
}
i++;
}
SDL_FreeSurface( media );
SDL_Quit( );
return 0;
}
編輯2:以前的if(i = 5)是印刷的並且已經得到糾正。
編輯3:我到家檢查了我的代碼。 我沒有輸入if (i=5)
,所以我很高興,因為那是一個很愚蠢的錯誤。 我也曾嘗試減小窗口的大小,但沒有成功,因此我們回到了主要問題。 另外,我嘗試了刪除循環,程序運行並且在關閉時出現了段錯誤,因此至少不是循環的錯。 但這是一個更大的問題。 順便說一句,我將發布真正的已編譯代碼,因為之前的代碼是由內存編寫的。
#include <iostream>
#include <SDL/SDL.h>
int main (int argc, char** argv)
{
SDL_Surface* window;
SDL_Surface* media;
int i;
SDL_Init (SDL_INIT_EVERYTHING);
window = SDL_SetVideoMode (2058, 1152, 32, SDL_SWSURFACE);
media = SDL_LoadBMP("xD.bmp");
while (true)
{
i++;
SDL_BlitSurface(media, NULL, window, NULL);
SDL_Flip(window);
SDL_Delay(5000);
SDL_FreeSurface(media);
if (i==5)
{
break;
}
}
SDL_FreeSurface(media);
SDL_Quit();
return 0;
}
我只是希望這只是發生在我身上,因為這是一件很混亂的事情。 和平,各位。
the main loop is run one single time and then the programs appears to close it self
除非是印刷錯誤,否則請更改
if( i = 5 )
至
if( i == 5 )
i = 5
操作將始終求值為TRUE
,從而導致break
。 除此之外,該程序可以在我的計算機上正確運行,沒有任何分段錯誤。
SDL_FreeSurface(media);
在每個循環迭代中,然后在循環中斷后再次循環。 這是錯誤的,因為free
media
懸空了指針並且不再指向有效位置。 從循環中刪除它,絕對沒有理由將其保留在那里。
另外,如對問題的評論中所述,請檢查window
和media
值。 無法保證映像存在並且可以加載,因此可以為NULL
。
當您嘗試訪問不應訪問的內存時,會發生分段錯誤。 例如下面:
int array[5];
array[20] = 0;
由於您正在訪問內存,因此不允許您訪問(尚未聲明),因此會出現分段錯誤。 如果嘗試動態聲明對象,內存泄漏也可能發生這種情況。
循環內部到底是什么? 我不太確定是什么原因導致的,除非您正在訪問不允許訪問的內存部分。 嘗試運行調試器,看看哪一行代碼完全失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.