我目前正在学习使用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;
}
我只是希望这只会发生在我身上,因为这是一件非常混乱的事情。 和平,研究员。
答案 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
悬挂指针并且不再指向有效位置后,这是错误的。从循环中删除它,绝对没有理由将它保留在那里。
此外,正如对问题的评论中所述,请检查window
和media
的值。无法保证图像存在且可以加载,因此它可以是NULL
。
答案 2 :(得分:-4)
当您尝试访问不应该访问的内存时,会发生分段错误。例如下面:
int array[5];
array[20] = 0;
因为您正在访问内存而不允许访问(它尚未声明),您将收到分段错误。如果您尝试动态声明对象,也会发生内存泄漏。
循环内部究竟是什么?我不太确定会导致它的原因,除非你正在访问你不允许的某些内存部分。尝试运行调试器并查看完全失败的代码行。