SDL2 分段错误
SDL2 Segmentation Fault
我正在尝试制作一个程序来根据键盘输入移动框,但目前它只设置为在屏幕上呈现一个绿色矩形。但是,程序似乎初始化了窗口,然后在终止之前只返回"分段错误(核心转储)"。我根本没有收到编译器错误,而且相当多的代码与我在网上找到的教程相匹配。如果它有所作为,我将使用 GCC 在 Ubuntu 上运行 Code::Blocks。
main
基本上按顺序调用称为init
、drawRect
和close
(均如下所示)的函数,根据成功或失败打印语句。
编辑:将其缩小到close
,如下所示。特别是,它SDL_FreeSurface和SDL_Quit给我带来问题。我还清理了有关指针处理的近距离(和程序的其他部分),并制作了一个新的 pastebin 文件。
关闭:
void close()
{
// Deallocate gScreenSurface
SDL_FreeSurface(gScreenSurface);
gScreenSurface=NULL;
// Destroy renderer
SDL_DestroyRenderer(gRenderer);
gRenderer=NULL;
// Destroy gWindow
SDL_DestroyWindow(gWindow);
gWindow=NULL;
SDL_Quit();
}
以下是新的完整源代码,包括指针初始化、包含和伪代码:
/* === Includes === */
#include <cstdlib>
#include <stdio.h>
#include "SDL2/SDL.h"
using namespace std;
/* === Constants === */
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
/* === Enums === */
/*enum Keys {KEY_DEFAULT,
KEY_UP,
KEY_DOWN,
KEY_LEFT,
KEY_RIGHT,
KEY_TOTAL};*/
/* === Prototypes === */
bool init();
bool drawRect(SDL_Renderer* pRenderer, SDL_Rect* pRect, int pX, int pY, int pW, int pH, int pR, int pG, int pB, int pA);
void close();
/* === Pointer Initialization === */
SDL_Window* gWindow = NULL;
SDL_Surface* gScreenSurface = NULL;
SDL_Renderer* gRenderer = NULL;
SDL_Rect* gRect = NULL;
/**==================================================
Box Mover
This was intended to be a learning activity to
teach myself how to use SDL, in particular basic
"block" graphics and keyboard inputs.
Unfortunately, I can't figure out why it's always
returning seg fault. I think it's outside of main,
but I can't be sure.
==================================================**/
int main()
{
if(!init())
printf("Failed to initialize!n");
else
{
if(!drawRect(gRenderer, gRect, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 255, 0, 255))
printf("Failed to draw rectangle!n");
else
{
/*SDL_BlitSurface( gImage, NULL, gScreenSurface, NULL);
SDL_UpdateWindowSurface(gWindow);
SDL_Delay(2000);*/
printf("Success in main!n"); // Placeholder until I figure out why I'm getting a seg fault, then I can fix the contents.
}
}
close();
return 0;
}
/*=========================
Init
Initializes SDL
Returns true for success, false for failure
Prints error on failure
=========================*/
bool init()
{
//Initialization flag
bool success = true;
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "SDL could not initialize! SDL_Error: %sn", SDL_GetError() );
success = false;
}
else
{
gWindow = SDL_CreateWindow( "Box Mover", 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0 );
if( gWindow == NULL )
{
printf( "Window could not be created! SDL_Error: %sn", SDL_GetError() );
success = false;
}
else
{
gScreenSurface = SDL_GetWindowSurface( gWindow );
}
}
return success;
}
/*=========================
Draw Rectangle
Draws a rectangle of specified color and location
TO DO:
Check to see if renderer needs to be deallocated here.
Inputs:
>> pRenderer: SDL_Renderer pointer which can be thought of as a drawing tool
>> pRect: SDL_Rect pointer which holds location and size data
>> pX, pY: X-Y location of the upper left corner of the rectangle
>> pR, pG, pB: Color values (technically Uint8, 0-255)
>> pA: Alpha (transparency) value of the rectangle (also technically Uint8)
=========================*/
bool drawRect(SDL_Renderer* pRenderer, SDL_Rect* pRect, int x, int y, int w, int h, int r, int g, int b, int a)
{
bool success = true;
pRenderer=SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_SOFTWARE);
if(pRenderer==NULL)
{
printf("Renderer could not be created! SDL Error: %sn", SDL_GetError());
success=false;
}
else
{
pRect = new SDL_Rect;
if(pRect == NULL)
{
printf("Could not create rectangle! SDL Error: %sn", SDL_GetError());
success=false;
}
else
{
pRect->x = x;
pRect->y = y;
pRect->w = w;
pRect->h = h;
SDL_SetRenderDrawColor(pRenderer, r, g, b, a);
if(SDL_RenderDrawRect(pRenderer, pRect) < 0)
{
printf("Rectangle could not be rendered! SDL Error: %sn", SDL_GetError());
success=false;
}
}
}
return success;
}
/*=========================
Close
Closes the SDL systems cleanly, deallocating memory.
Found the seg fault! It's this fucker!
In particular, SDL_FreeSurface and SDL_Quit
=========================*/
void close()
{
// Deallocate gScreenSurface
SDL_FreeSurface(gScreenSurface);
gScreenSurface=NULL;
printf("Surface closed. Working on renderer...n");
// Destroy renderer
SDL_DestroyRenderer(gRenderer);
gRenderer=NULL;
printf("Renderer closed. Working on window...n");
// Destroy gWindow
SDL_DestroyWindow(gWindow);
gWindow=NULL;
printf("Window closed. Working on SDL...n");
SDL_Quit();
printf("SDL closed.n");
}
您将SDL_Renderer *renderer
指针按值传递给drawRect
函数,并在该函数中对其进行初始化。这不是初始化你在全局范围内拥有的指针,而是启动它的副本,当你退出函数时,它会丢失。然后close
从全局范围调用指针上的SDL_DestroyRenderer
,即NULL
。
如果你想初始化drawRect
函数中的全局,你需要传递一个指向该函数的指针(SDL_Renderer **
)。
在你调用drawRect
函数中,SDL_RenderDrawRect
,这是将矩形渲染到后台缓冲区上,然后在屏幕上绘制它,你需要使用调用来SDL_RenderPresent
不要尝试释放从SDL_GetWindowSurface()
返回的图面,SDL 管理返回指针本身的生存期:
gScreenSurface = SDL_GetWindowSurface( gWindow );
...
SDL_FreeSurface(gScreenSurface);
请参阅SDL_GetWindowSurface()
文档(强调我的):
言论
如有必要,将使用窗口的最佳格式创建新曲面。当窗口被破坏时,此表面将被释放。不要释放此曲面。
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 为什么我使用 std::copy() 收到运行时错误(分段错误)?
- 为什么我的代码包含错误分段错误(核心转储)?
- 为什么会出现此错误?- 分段错误(核心转储)
- 意外的运行时错误(分段错误)
- C++将文本文件读入数组,运行错误:分段错误
- mmap 错误:分段错误/指针无效错误
- 在我的代码中找不到错误....分段错误
- 错误:分段故障(核心转储)阵列
- 用string.h将错误分段到队列中
- c++字符串流转换错误:分段错误
- 为什么我的代码显示错误分段错误(核心转储)