C++ 函数在第二次调用后崩溃
C++ function crashes after second call
我正在使用 C++ SDL2 库创建游戏。我的游戏在屏幕顶部有一个状态栏,应该在每次移动后更新。但是,更新只能进行一次。再次更新导致程序崩溃
我做了一些测试,发现当使用 SDL_CreateTextureFromSurface()
将表面转换为纹理时程序会崩溃
这是我使用的函数。
//screen* is a pointer to an object that contains all screen information
// such as dimensions, the renderer, the surface and the window object
void status_bar::update(int B, const char* E, screen* display){
if(B == 0){ //color is declared in status_bar object
color.r = 0;
color.g = 255;
color.b = 0;
}else{
color.r = 255;
color.g = 255;
color.b = 255;
}
SDL_Surface* temp_surf = TTF_RenderText_Solid(font, std::to_string(long double(B)).c_str(), color);
balanceRECT = temp_surf->clip_rect;
if(!balanceTEXT){
SDL_DestroyTexture(balanceTEXT);
}
balanceTEXT = SDL_CreateTextureFromSurface(display->Renderer, temp_surf); //Here the program crashes
balanceRECT.x = B_Mid_Coord.x - (balanceRECT.w / 2);
balanceRECT.y = B_Mid_Coord.y - (balanceRECT.h / 2);
SDL_FreeSurface(temp_surf);
temp_surf = TTF_RenderText_Solid(font, E, white);
energyRECT = temp_surf->clip_rect;
if(!energyTEXT){
SDL_DestroyTexture(energyTEXT);
}
energyTEXT = SDL_CreateTextureFromSurface(display->Renderer, temp_surf);
energyRECT.x = E_Mid_Coord.x - (energyRECT.w / 2);
energyRECT.y = E_Mid_Coord.y - (energyRECT.h / 2);
SDL_FreeSurface(temp_surf);
}
我已经初始化了所有 SDL 库,所以这应该不是问题所在。渲染器不会在更新之间消失。
每次更新都会声明和定义临时表面,这样也应该没问题。
为什么这个功能会导致我的游戏崩溃?
您确定崩溃不在上一行吗?
if(!balanceTEXT){
SDL_DestroyTexture(balanceTEXT);
}
您似乎在试图破坏一个 NULL
指针
我认为它可能是带有 NULL 指针的东西。也许在 SDL_CreateTextureFromSurface 调用之前检查显示对象指针。
我找到了我的问题。第一次调用更新函数是在 class 的构造函数中。此构造函数将 screen*
对象作为参数。我调用了参数display
。但是,class 本身也有一个 screen*
变量 display
。
所以第一次使用了参数display
,它确实有值,但是第二次使用了class变量display
,我忘记定义了。我将参数更改为 DP
并将 display = DP
添加到构造函数中。
我正在使用 C++ SDL2 库创建游戏。我的游戏在屏幕顶部有一个状态栏,应该在每次移动后更新。但是,更新只能进行一次。再次更新导致程序崩溃
我做了一些测试,发现当使用 SDL_CreateTextureFromSurface()
这是我使用的函数。
//screen* is a pointer to an object that contains all screen information
// such as dimensions, the renderer, the surface and the window object
void status_bar::update(int B, const char* E, screen* display){
if(B == 0){ //color is declared in status_bar object
color.r = 0;
color.g = 255;
color.b = 0;
}else{
color.r = 255;
color.g = 255;
color.b = 255;
}
SDL_Surface* temp_surf = TTF_RenderText_Solid(font, std::to_string(long double(B)).c_str(), color);
balanceRECT = temp_surf->clip_rect;
if(!balanceTEXT){
SDL_DestroyTexture(balanceTEXT);
}
balanceTEXT = SDL_CreateTextureFromSurface(display->Renderer, temp_surf); //Here the program crashes
balanceRECT.x = B_Mid_Coord.x - (balanceRECT.w / 2);
balanceRECT.y = B_Mid_Coord.y - (balanceRECT.h / 2);
SDL_FreeSurface(temp_surf);
temp_surf = TTF_RenderText_Solid(font, E, white);
energyRECT = temp_surf->clip_rect;
if(!energyTEXT){
SDL_DestroyTexture(energyTEXT);
}
energyTEXT = SDL_CreateTextureFromSurface(display->Renderer, temp_surf);
energyRECT.x = E_Mid_Coord.x - (energyRECT.w / 2);
energyRECT.y = E_Mid_Coord.y - (energyRECT.h / 2);
SDL_FreeSurface(temp_surf);
}
我已经初始化了所有 SDL 库,所以这应该不是问题所在。渲染器不会在更新之间消失。 每次更新都会声明和定义临时表面,这样也应该没问题。
为什么这个功能会导致我的游戏崩溃?
您确定崩溃不在上一行吗?
if(!balanceTEXT){
SDL_DestroyTexture(balanceTEXT);
}
您似乎在试图破坏一个 NULL
指针
我认为它可能是带有 NULL 指针的东西。也许在 SDL_CreateTextureFromSurface 调用之前检查显示对象指针。
我找到了我的问题。第一次调用更新函数是在 class 的构造函数中。此构造函数将 screen*
对象作为参数。我调用了参数display
。但是,class 本身也有一个 screen*
变量 display
。
所以第一次使用了参数display
,它确实有值,但是第二次使用了class变量display
,我忘记定义了。我将参数更改为 DP
并将 display = DP
添加到构造函数中。