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() が行う作業である Screen サーフェスを解放しようとしたことが原因でした。なぜ私がそれをしていたのかわかりません: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 に答える