C ++ SDL分段故障(核心转储)

时间:2014-04-23 05:49:37

标签: c++ sdl sdl-1.2

我目前正在学习使用C ++作为基础编程语言在SDL上编码。

所以基本上,发生了什么,我有一段带有循环的代码,它将显示一个图像,直到循环再次开始。循环是5秒长,程序有一个迭代器我设置为0,随着每个循环增加,直到它达到5,当它通过break退出循环。然后SDL按预期退出,程序运行完毕。

没有编译错误,仅供参考。当我运行程序时,主循环运行一次,然后程序似乎自动关闭它,在我的终端窗口上打印一条消息,说明"分段故障(核心转储)"。

这是什么意思,怎么做才能实现呢?谢谢你提前。

编辑:代码就是这个,抱歉没有写过。我记得因为我目前不在家。

#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;
}

我只是希望这只会发生在我身上,因为这是一件非常混乱的事情。 和平,研究员。

3 个答案:

答案 0 :(得分:2)

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。除此之外,程序在我的计算机上正确运行,没有分段错误。

答案 1 :(得分:0)

每次循环迭代时

SDL_FreeSurface(media);,然后在循环被破坏后再次出现。在free media悬挂指针并且不再指向有效位置后,这是错误的。从循环中删除它,绝对没有理由将它保留在那里。

此外,正如对问题的评论中所述,请检查windowmedia的值。无法保证图像存在且可以加载,因此它可以是NULL

答案 2 :(得分:-4)

当您尝试访问不应该访问的内存时,会发生分段错误。例如下面:

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

因为您正在访问内存而不允许访问(它尚未声明),您将收到分段错误。如果您尝试动态声明对象,也会发生内存泄漏。

循环内部究竟是什么?我不太确定会导致它的原因,除非你正在访问你不允许的某些内存部分。尝试运行调试器并查看完全失败的代码行。