簡體   English   中英

C ++ SDL分段錯誤(核心已轉儲)

[英]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懸空了指針並且不再指向有效位置。 從循環中刪除它,絕對沒有理由將其保留在那里。

另外,如對問題的評論中所述,請檢查windowmedia值。 無法保證映像存在並且可以加載,因此可以為NULL

當您嘗試訪問不應訪問的內存時,會發生分段錯誤。 例如下面:

int array[5];
array[20] = 0;

由於您正在訪問內存,因此不允許您訪問(尚未聲明),因此會出現分段錯誤。 如果嘗試動態聲明對象,內存泄漏也可能發生這種情況。

循環內部到底是什么? 我不太確定是什么原因導致的,除非您正在訪問不允許訪問的內存部分。 嘗試運行調試器,看看哪一行代碼完全失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM