c++函数在第二次调用后崩溃

C++ function crashes after second call

本文关键字:崩溃 调用 第二次 函数 c++      更新时间:2023-10-16

我正在使用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库,所以这应该不是问题。渲染器不会在更新之间消失。临时表面在每次更新时都声明和定义,因此也应该没问题。

为什么这个函数会导致我的游戏崩溃?

我认为它可以是NULL指针的东西。也许在调用SDL_CreateTextureFromSurface之前检查显示对象指针

你确定崩溃不是在上一行吗?

if(!balanceTEXT){
    SDL_DestroyTexture(balanceTEXT);
}

似乎你正在试图破坏一个NULL指针

我找到我的问题了。第一次调用update函数是在类的构造函数中。这个构造函数接受一个screen*对象作为参数。我称这个参数为display。但是,类本身也有一个screen*变量display。所以第一次使用的是参数display,它确实有一个值,但是第二次使用的是类变量display,我忘记定义了。我将参数改为DP,并将display = DP添加到构造函数中。