【问题标题】:How to correctly free resources allocated by SDL_ttf?如何正确释放 SDL_ttf 分配的资源?
【发布时间】:2019-04-06 23:53:01
【问题描述】:

我按照a previous question 中的建议解决了将文件加载到内存中的问题。但是,当我释放资源时,我发现了一个问题。如果我在释放保存它的结构之前尝试释放TTF_Font 文件,程序就会崩溃。

我相信它的发生是因为 Free() 加倍。 Free() 两次导致未定义的行为。

根据文档,TTF_CloseFont 释放 BOTH 字体指针和字体本身。我怀疑当这种情况发生时,SDL_RWclose 会释放一个已经释放的指针,所以它会崩溃。但是当SDL_RWclose 释放TTF_CloseFont 释放的资源之一,字体本身,它不会发生。对我来说未定义行为的另一个迹象

更多信息:ptr_mem_buff(存储字体的位置)的释放顺序不会影响崩溃(在我的环境中)。

另外,设置指向nullptr 的指针应该已经解决了,因为free(nullptr) 没有结果。但是即使在TTF_CloseFont(ptr_Font); 之后将ptr_Font 设置为null,程序仍然崩溃

我应该如何正确释放这些资源?

代码 sn-p:

    ptr_str_rwops = SDL_RWFromFile("IMG/FreeMono.ttf", "rb");
        var_size_of_file = SDL_RWsize(ptr_str_rwops);
        ptr_mem_buff = calloc(1, var_size_of_file);
        SDL_RWread(ptr_str_rwops, ptr_mem_buff, 1, var_size_of_file);
        SDL_RWclose(ptr_str_rwops);

    ptr_str_rwops2 = SDL_RWFromConstMem(ptr_mem_buff, var_size_of_file);
        ptr_Font = TTF_OpenFontRW(ptr_str_rwops2, 1, 72);
            ptr_Superficie_texto = TTF_RenderText_Solid(ptr_Font, "Hello World", str_SDL_colour);

    /*CUT UNRELATED CODE*/

//  Example 1:  works fine (in my environment, but I suspect undefined behaviour)
    SDL_RWclose(ptr_str_rwops2);
    free(ptr_mem_buff);
    TTF_CloseFont(ptr_Font);

//  Example 2: crashes everytime, I believe exist double Free()

    TTF_CloseFont(ptr_Font);
    SDL_RWclose(ptr_str_rwops2);
    free(ptr_mem_buff);

// Another approach:

    TTF_CloseFont(ptr_Font);
    ptr_Font = nullptr;
    SDL_RWclose(ptr_str_rwops2); // still crashes
    free(ptr_mem_buff);

【问题讨论】:

  • 您将1 传递给TTF_OpenFontRW,这表明它将自动关闭并释放源。我想您应该通过0 并手动关闭/释放ptr_str_rwops2,或者通过1 而不要手动关闭/释放ptr_str_rwops2

标签: c free sdl-2


【解决方案1】:

这个电话

ptr_Font = TTF_OpenFontRW(ptr_str_rwops2, 1, 72);

告诉 TTF 处理 RWOps 流(这就是 1 的含义)。您不必关闭该流,因为对 TTF_CloseFont() 的调用将执行此操作。你必须释放ptr_mem_buff,因为RWOps流不会这样做。

【讨论】:

    猜你喜欢
    • 2016-02-03
    • 1970-01-01
    • 2012-11-20
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 2021-04-21
    相关资源
    最近更新 更多