我对C ++比较陌生,我正在使用SDL 2.0学习它。尝试使用 Sprite 类绘制精灵时遇到以下错误:
SDDDDL2.exe中的0x000000006C793659(SDL2.dll)抛出异常:0xC0000005:访问冲突读取位置0xFFFFFFFFFFFFFFFF。
以下代码是 Sprite 类中所涉及代码的精简版本:
public:
SDL_Texture *image = NULL;
SDL_Rect rect;
void SetTexture(SDL_Texture *texture)
{
image = texture;
rect.x = 100; rect.y = 100; rect.w = 64; rect.h = 64;
}
void DrawSprite(SDL_Renderer *renderer)
{
SDL_RenderCopy(renderer,image,NULL,&rect); //Calling this causes the
//error
}
我主游戏课程中的关键代码" Game.cpp"
Sprite *testSprite = NULL;
SDL_Texture *testTex = NULL;
void LoadContent()
{
SDL_Surface *bmpSurface = SDL_LoadBMP("sprite.bmp");
testTex = SDL_CreateTextureFromSurface(renderer, bmpSurface);
testSprite = &Sprite(Vector2(100,100),Vector2(50,50)); // Just the
//constuctor, this is not affecting the issue
testSprite->SetTexture(testTex);
SDL_FreeSurface(bmpSurface);
}
void Draw ()
{
testSprite->DrawSprite(renderer); // Get the error when calling this
}
我通过测试知道确实是传递到SDL_RenderCopy函数(图像)的纹理导致了问题,因为如果我在Game.cpp文件中调用该函数不会发生这种情况使用" testTex"图像。
我也知道SDL_RenderCopy函数中使用的纹理不是 NULL ,因为我在调用SDL_RenderCopy之前使用了空值检查,并且无论如何都调用了它。
答案 0 :(得分:1)
我认为问题出在这一行:testSprite = &Sprite(Vector2(100,100), Vector2(50,50));
testSprite
返回后,LoadContent()
分配的地址值无效。
将其替换为例如testSprite = new Sprite(Vector2(100,100),Vector2(50,50));
并重新运行。