程序收到信号 SIGSEGV,getter 方法中的分段错误
Program received signal SIGSEGV, Segmentation fault in getter method
我正在使用 Code::Blocks 制作游戏,遇到了分段错误。我在这里查看了其他问题,但找不到任何有用的信息。我有一个代表游戏中基本对象的 Sprite
class 和一个控制游戏屏幕显示的 Window
class 。我 运行 调试器,它在下面 getImage()
方法的 return image;
行给了我错误。
SDL_Surface* Sprite::getImage() {
return image;
}
我在 Sprite
的构造函数中调用了以下 setImage()
方法,我验证了 SDL_ConvertSurface
没有 return NULL
.
void Sprite::setImage(string path) {
SDL_Surface* loadedSurface = IMG_Load( path.c_str() );
if( loadedSurface == NULL ) {
printf( "Unable to load image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError() );
} else {
image = SDL_ConvertSurface( loadedSurface, surface->format, NULL );
if( image == NULL ) {
printf( "Unable to optimize image %s! SDL Error: %s\n", path.c_str(), SDL_GetError() );
}
SDL_FreeSurface( loadedSurface );
}
}
我在Window
的mainloop()
中调用方法getImage()
,如下图,其中sprites
声明为Sprite* sprites[10];
:
void Window::mainloop() {
bool quit = false;
SDL_Event e;
while( !quit ) {
while( SDL_PollEvent( &e ) != 0 ) {
if( e.type == SDL_QUIT ) {
quit = true;
}
}
SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, red, green, blue ) );
for (int i = 0; i < spritesNum; i++) {
SDL_BlitScaled( sprites[spritesNum]->getImage() , NULL, screenSurface, sprites[spritesNum]->getRect() );
}
SDL_UpdateWindowSurface( window );
}
}
您的索引可能超出范围
for (int i = 0; i < spritesNum; i++) {
SDL_BlitScaled( sprites[spritesNum]->getImage() , NULL, screenSurface, sprites[spritesNum]->getRect() );
}
我假设您想使用计数器 i
?
for (int i = 0; i < spritesNum; i++) {
SDL_BlitScaled( sprites[i]->getImage() , NULL, screenSurface, sprites[i]->getRect() );
}
否则,如果您的数组 sprites
的长度为 spritesNum
,则您的索引超出了范围,并且这样做了 spritesNum
次。
无论如何,您至少应该确认您没有在此处取消引用空指针
sprites[i]->getImage()
我正在使用 Code::Blocks 制作游戏,遇到了分段错误。我在这里查看了其他问题,但找不到任何有用的信息。我有一个代表游戏中基本对象的 Sprite
class 和一个控制游戏屏幕显示的 Window
class 。我 运行 调试器,它在下面 getImage()
方法的 return image;
行给了我错误。
SDL_Surface* Sprite::getImage() {
return image;
}
我在 Sprite
的构造函数中调用了以下 setImage()
方法,我验证了 SDL_ConvertSurface
没有 return NULL
.
void Sprite::setImage(string path) {
SDL_Surface* loadedSurface = IMG_Load( path.c_str() );
if( loadedSurface == NULL ) {
printf( "Unable to load image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError() );
} else {
image = SDL_ConvertSurface( loadedSurface, surface->format, NULL );
if( image == NULL ) {
printf( "Unable to optimize image %s! SDL Error: %s\n", path.c_str(), SDL_GetError() );
}
SDL_FreeSurface( loadedSurface );
}
}
我在Window
的mainloop()
中调用方法getImage()
,如下图,其中sprites
声明为Sprite* sprites[10];
:
void Window::mainloop() {
bool quit = false;
SDL_Event e;
while( !quit ) {
while( SDL_PollEvent( &e ) != 0 ) {
if( e.type == SDL_QUIT ) {
quit = true;
}
}
SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, red, green, blue ) );
for (int i = 0; i < spritesNum; i++) {
SDL_BlitScaled( sprites[spritesNum]->getImage() , NULL, screenSurface, sprites[spritesNum]->getRect() );
}
SDL_UpdateWindowSurface( window );
}
}
您的索引可能超出范围
for (int i = 0; i < spritesNum; i++) {
SDL_BlitScaled( sprites[spritesNum]->getImage() , NULL, screenSurface, sprites[spritesNum]->getRect() );
}
我假设您想使用计数器 i
?
for (int i = 0; i < spritesNum; i++) {
SDL_BlitScaled( sprites[i]->getImage() , NULL, screenSurface, sprites[i]->getRect() );
}
否则,如果您的数组 sprites
的长度为 spritesNum
,则您的索引超出了范围,并且这样做了 spritesNum
次。
无论如何,您至少应该确认您没有在此处取消引用空指针
sprites[i]->getImage()