此功能导致窗口空白然后崩溃

问题描述

我试图找出为什么这样的代码不起作用,经过一些测试我发现函数 submitSprite 有崩溃的原因,但我不知道如何修复它

#include "renderer.h"

Renderer neWrenderer(SDL_Window* window)
{
    Renderer renderer;
    renderer.renderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);

    return renderer;
}

void destroyRenderer(Renderer renderer)
{
    SDL_DestroyRenderer(renderer.renderer);
}

void submitSprite(Renderer renderer,Sprite sprite)
{
    SDL_Rect* rect;
    rect->x=sprite.x;
    rect->y=sprite.y;
    rect->w=sprite.w;
    rect->h=sprite.h;

    SDL_Rendercopy(renderer.renderer,sprite.texture,NULL,rect);
}

void render(Renderer renderer)
{
    SDL_RenderPresent(renderer.renderer);
    SDL_RenderClear(renderer.renderer);
}

renderer.renderer 是一个 SDL_Renderer*

解决方法

void submitSprite(Renderer renderer,Sprite sprite)
{
    SDL_Rect* rect;
    rect->x=sprite.x;
    rect->y=sprite.y;
    rect->w=sprite.w;
    rect->h=sprite.h;

    SDL_RenderCopy(renderer.renderer,sprite.texture,NULL,rect);
}

在这里您访问一个从未初始化的指针。因此,要么使用局部变量,要么为其分配(并释放)内存。

即:

void submitSprite(Renderer renderer,Sprite sprite)
{
    SDL_Rect rect;
    rect.x=sprite.x;
    rect.y=sprite.y;
    rect.w=sprite.w;
    rect.h=sprite.h;

    SDL_RenderCopy(renderer.renderer,&rect);
}
,

我无法写评论,但我想补充一点,您应该创建 oneSDL_Renderer 实例,而不是在需要时继续创建。正如 Devolus 所说,通过指针传递。如果您忘记调用 SDL_DestroyRenderer(),则在创建后按值传递也会导致内存泄漏,这也会增加该方法的速度。当您需要渲染器时,请使用参数 SDL_Renderer* renderer