我想出了一个我的程序在调用SDL_DestroyRenderer(SDL_Renderer* renderer);
时抛出SEGFAULT的最小例子
int Setup(t_game* game)
{
if (SDL_Init(SDL_INIT_VIDEO) != 0)
{
fprintf(stderr, "Error Init SDL");
return 0;
}
game->window = SDL_CreateWindow("Client",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
SCREEN_X,
SCREEN_Y,
SDL_WINDOW_SHOWN);
game->renderer = SDL_CreateRenderer(game->window, -1, SDL_RENDERER_ACCELERATED);
SDL_SetRenderDrawColor(game->renderer, 255, 0, 0, 255);
return 1;
}
void Cleanup(t_game* game)
{
SDL_DestroyRenderer(game->renderer);
SDL_DestroyWindow(game->window);
SDL_Quit();
}
void Loop(t_game* game)
{
SDL_Event event;
int loop = 1;
while (loop)
{
SDL_RenderClear(game->renderer);
SDL_RenderPresent(game->renderer);
loop = EventHandler(&event, game);
}
}
主要调用的函数如下:
int main()
{
t_game game;
Setup(&game);
Loop(&game);
Cleanup(&game);
return 0;
}
游戏结构声明如下:
typedef struct s_game
{
SDL_Renderer* renderer;
SDL_Window* window;
} t_game;
在清理过程中,我得到一个SEGFAULT,上面写着无效的免费
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7ae1f9c in ?? () from /usr/lib/libSDL2-2.0.so.0
(gdb) bt
#0 0x00007ffff7ae1f9c in ?? () from /usr/lib/libSDL2-2.0.so.0
#1 0x00005555555554d0 in Cleanup (game=0x7fffffffdd90)
#2 0x00005555555555e9 in main (argc=1, argv=0x7fffffffdea8)
然而,在gdb中,在所有3个函数中设置断点之后,对于呈现器,我总是有相同的指针。
更新1: --如果我将所有三个函数放在一起,我就不再有错误了。更新2:
int EventHandler(SDL_Event* event, t_game* game)
{
while (SDL_PollEvent(event))
{
switch(event->type)
{
case SDL_QUIT:
return 0;
break;
case SDL_KEYUP:
switch (event->key.keysym.sym)
{
case SDLK_ESCAPE:
return 0;
}
}
}
return 1;
}
发布于 2018-04-20 22:32:13
看来,hugepages在某种程度上干扰了SDL2,因为禁用它解决了无效的空闲错误。
https://stackoverflow.com/questions/49927590
复制相似问题