首页 > 解决方案 > 尝试轮询事件时出现 SDL2 分段错误

问题描述

我想创建一个小程序,它应该绘制一些数学函数。

起初只是写了代码,应该创建一个小窗口,在我点击窗口上的 X 之前,它应该是可见的。

#include <iostream>
#include <SDL2/SDL.h>

SDL_Window* window;
SDL_Renderer* renderer;
bool running = true;

bool init() {
    if(SDL_Init(SDL_INIT_EVERYTHING) < 0) return false;
    window = SDL_CreateWindow("Visual Functions", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 100, 200, SDL_WINDOW_SHOWN);
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if(window == NULL) return false;
    if(renderer == NULL) return false;
    std::cout << "App and SDL init success" << std::endl;
    return true;
}

void onEvent(SDL_Event* event) {
    switch (event->type)
    {
    case SDL_QUIT:
        running = false;
        break;
    
    default:
        break;
    }
}

void loop() {
    SDL_Event* event;
    while(SDL_PollEvent(event)) onEvent(event);
}

void cleanUp() {
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
}


int main(int, char**) {
    if(!init()) {
        std::cout << "SDL or/and App init failed" << std::endl;
        exit(-1);
    }

    while(running) loop();

    cleanUp();
}

但是窗口弹出的速度如此之快,然后又向下弹出,我什至看不到它,并且在命令中起初是,App and SDL init success但后来出现了Segmentation fault。在其他代码中,具有相同的初始化和循环代码运行得非常好,并且所有内容都正常显示(至少对于 SDL 部分)。我发现一些调试消息,循环不是到事件函数,也不是到循环函数的末尾,所以问题是SDL_PollEvent(event),但问题是什么以及如何解决它?

标签: c++sdl-2

解决方案


您永远不会创建您正在使用的 SDL_Event 结构:

void loop() {
    SDL_Event* event;
    while(SDL_PollEvent(event)) onEvent(event);
}

应该是这个

void loop() {
    SDL_Event event;
    while(SDL_PollEvent(&event)) onEvent(&event);
}

推荐阅读