0

我只是试图省略 SDL_Init() 函数,但一切仍在工作。我的意思是音频和图形。这是否意味着此功能无用?

此外,当我关闭程序时出现运行时错误:“此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息”

这可能是什么原因造成的?我正在正确关闭所有内容:

SDL_FreeSurface(Screen);
SDL_FreeSurface(Message);
Mix_FreeMusic(mus2);
TTF_CloseFont(Font);
TTF_Quit();
SDL_Quit();

这些是我使用的唯一表面/字体/音乐:

//The surfaces
TTF_Font *Font = NULL;
SDL_Surface *Screen = NULL;
SDL_Surface *Message = NULL;
Mix_Music *mus2 = Mix_LoadMUS("./music.mp3");

如果需要整个源代码,请询问!

编辑:错误是由于我试图释放屏幕表面!

4

2 回答 2

1

该错误是由于我试图释放屏幕表面,这实际上是 SDL_Quit() 所做的任务。我不知道我为什么这样做:P

于 2012-09-28T17:32:38.500 回答
0

的主要功能SDL_Init()似乎是错误处理(除了初始化各种子系统)。从源代码中SDL_Init()调用以下函数:

void SDL_InstallParachute(void)
{
/* Set a handler for any fatal signal not already handled */
int i;
#ifdef HAVE_SIGACTION
struct sigaction action;

for ( i=0; SDL_fatal_signals[i]; ++i ) {
    sigaction(SDL_fatal_signals[i], NULL, &action);
    if ( action.sa_handler == SIG_DFL ) {
        action.sa_handler = SDL_Parachute;
        sigaction(SDL_fatal_signals[i], &action, NULL);
    }
}
#ifdef SIGALRM
/* Set SIGALRM to be ignored -- necessary on Solaris */
sigaction(SIGALRM, NULL, &action);
if ( action.sa_handler == SIG_DFL ) {
    action.sa_handler = SIG_IGN;
    sigaction(SIGALRM, &action, NULL);
}
#endif
#else
void (*ohandler)(int);

for ( i=0; SDL_fatal_signals[i]; ++i ) {
    ohandler = signal(SDL_fatal_signals[i], SDL_Parachute);
    if ( ohandler != SIG_DFL ) {
        signal(SDL_fatal_signals[i], ohandler);
    }
}
#endif /* HAVE_SIGACTION */
return;
}

该函数建立了一个安全网,可以处理初始化子系统似乎无法处理的运行时错误。这可能解释了您在退出应用程序时遇到的运行时错误,因为这可能不会由子系统处理。

简而言之,如果开发人员希望调用库的初始化方法只是为了安全,您应该始终调用它。

于 2012-08-24T12:28:19.027 回答