c - 如何正确释放SDL_ttf分配的资源?

标签 c free sdl-2

我遵循了 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,程序仍然崩溃

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

代码片段:

    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);

最佳答案

本次通话

ptr_Font = TTF_OpenFontRW(ptr_str_rwops2, 1, 72);

告诉 TTF 处理 RWOps 流(这就是 1 的意思)。您不必关闭该流,因为调用 TTF_CloseFont() 即可完成此操作。不过,您一定必须释放ptr_mem_buff,因为 RWOps 流不会这样做。

关于c - 如何正确释放SDL_ttf分配的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55554478/

相关文章:

c++ - C 中的 C++ '*&' 等价于什么?它甚至存在吗?

asp.net - 如何发送post请求?

c - 以良好的方式在 C 中分配和释放内存

javascript - 使用 SDL2 + emscripten 时浏览器不加载本地镜像

c - SDL2 如何绘制虚线

c++ - 巨大的 SDL_Textures - 内存不足

c - `gdb` 给出了 `ret` 和自然返回的不同结果

C - 数组的递归累加和

在带有 return + C 的方法中正确使用 free()

c - 声明 gchar 后是否需要 g_free?