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

How to correctly free resources allocated by SDL_ttf?

我按照 中的建议解决了将文件加载到内存中的问题。但是,当我释放资源时,我发现了一个问题。如果我在释放包含它的结构之前尝试释放 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() 即可。不过,您 DO 必须释放 ptr_mem_buff,因为 RWOps 流不会那样做。