c++ - 尝试轮询事件时出现 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)
,但问题是什么以及如何解决它?
解决方案
您永远不会创建您正在使用的 SDL_Event 结构:
void loop() {
SDL_Event* event;
while(SDL_PollEvent(event)) onEvent(event);
}
应该是这个
void loop() {
SDL_Event event;
while(SDL_PollEvent(&event)) onEvent(&event);
}
推荐阅读
- excel - 将一个表中的数据与 Excel 中的另一个表匹配
- sql - 如何根据旁边列的条件将来自不同列的值相加?
- php - 通过 WooCommerce 中的挂钩有条件地更改产品税类
- codeigniter - 升级后的 Codeigniter 错误:未定义的属性:CI_DB_mysqli_driver::$ar_orderby
- wordpress - 谷歌索引 + Yoast SEO 媒体附件
- reactjs - 如何在 React 中测试 onChange?
- r - R:将包含类似 Excel 的相对引用的函数应用到其他列
- arrays - 如何从字符串中提取特定数据?
- javascript - Nodemailer 6.1.1 不适用于 NodeJs >=12
- c# - LeftMouseUp not firing - Bing Maps MapPolyline