2015-10-06 25 views
3

从教程网站采取以下基本SDL2代码会引起一些奇怪的麻烦:SDL_QUIT()导致SIGBUS错误

#include <SDL2/SDL.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 

#define SCREENH 768 
#define SCREENW 1366 

SDL_Window *window = NULL; 
SDL_Surface *screenSurface = NULL; 
SDL_Surface *windowSurface = NULL; 

int init_SDL() { 
    int success = 0; 
    if(SDL_Init(SDL_INIT_VIDEO) < 0) { 
     printf("SDL could not initialize! "); 
     printf("SDL_Error: %s\n",SDL_GetError()); 
     success = -1; 
    } 
    else { 
     window = SDL_CreateWindow("SDL2_Tutorial02",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,SCREENW,SCREENH,SDL_WINDOW_SHOWN); 
     if(window == NULL) { 
      printf("Window could not be created! "); 
      printf("SDL Error: %s\n",SDL_GetError()); 
     } 
     else { 
      screenSurface = SDL_GetWindowSurface(window); 
     } 
    } 
    return success; 
} 

int loadMedia() { 
    int success = 0; 
    windowSurface = SDL_LoadBMP("Images/Hallo.bmp"); 
    if(windowSurface == NULL) { 
    printf("Unable to load image! "); 
    printf("SDL Error: %s\n",SDL_GetError()); 
    success = -1; 
    } 
    return success; 
} 

void close() { 
    SDL_FreeSurface(windowSurface); 
    windowSurface = NULL; 
    SDL_DestroyWindow(window); 
    window = NULL; 
    SDL_Quit(); 
} 

int main(int argc,char *argv[]) { 
    assert(init_SDL() == 0); 
    assert(loadMedia() == 0); 
    SDL_BlitSurface(windowSurface,NULL,screenSurface,NULL); 
    SDL_UpdateWindowSurface(window); 
    SDL_Delay(3000); 
    close(); 
    exit(EXIT_SUCCESS); 
} 

只要SDL_QUIT(),放置在靠近()被调用我收到内存访问错误。使用GDB下面揭晓:

49  SDL_Quit(); 
(gdb) n 

Program received signal SIGBUS, Bus error. 
0x00007ffff68a5895 in ??() from /usr/lib/x86_64-linux-gnu/libX11.so.6 
(gdb) 

的奇怪那就是当我把SDL_QUIT()close()方法是这样的外:

void close() { 
    SDL_FreeSurface(windowSurface); 
    windowSurface = NULL; 
    SDL_DestroyWindow(window); 
    window = NULL; 
} 

int main(int argc,char *argv[]) { 
    assert(init_SDL() == 0); 
    assert(loadMedia() == 0); 
    SDL_BlitSurface(windowSurface,NULL,screenSurface,NULL); 
    SDL_UpdateWindowSurface(window); 
    SDL_Delay(3000); 
    close(); 
    SDL_Quit(); 
    exit(EXIT_SUCCESS); 
} 

所有的东西都很好。 SDL_Quit()可正常工作。当我在另一个函数中调用SDL_Quit()时,为什么会导致SIGBUS错误?

编辑:此代码被编译与海湾合作委员会的Ubuntu 14.04和下面的编译命令

gcc -g3 -o tutorial tutorial.c `sdl2-config --cflags --libs` 

回答

4

你的功能close()是冲突与同名造成怪异的行为(实际上,它是一个内部SDL功能由SDL调用的libc标准close()系统调用)。

重命名你的功能,它应该没问题。