【问题标题】:This function cause the window to be blank then crashes此函数导致窗口为空白然后崩溃
【发布时间】:2021-01-29 12:12:41
【问题描述】:

我试图找出为什么代码不起作用,经过一些测试我发现函数 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*

【问题讨论】:

  • SDL_Rect* rect; 需要malloc
  • @IrAM 你是什么意思?为什么需要 malloc?
  • @Gabryx86_64 因为它只是一个指针,而且你从来没有让它指向任何分配的对象......所以你不能用它做任何事情并且如果你这样做的话会有未定义的行为。
  • 您还应该考虑是否真的要按值传递此类结构,因为它会复制它们,如果它们很大,则没有必要这样做,并且可能会降低性能。为避免复制它们,请通过指向const 的指针传递它们(如果您需要修改任何内容,请删除const)。
  • 你很幸运它崩溃了。这种错误会产生各种奇怪的副作用。 :)

标签: c sdl-2 sdl-image


【解决方案1】:
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, sprite.texture, NULL, &rect);
}

【讨论】:

  • 正如 underscore_d 也指出的那样,您应该使用指针而不是按值传递。使它更快。 ;)
【解决方案2】:

我不能写评论,但我想补充一点,您应该创建SDL_Rendererone 实例,而不是在需要时继续创建。正如 Devolus 所说,按指针传递。如果您忘记调用SDL_DestroyRenderer(),在创建一个值后传递值也会给您带来内存泄漏,这也增加了该方法的速度。当你需要一个渲染器时,有参数SDL_Renderer* renderer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    相关资源
    最近更新 更多