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

时间:2019-04-06 23:53:02

标签: 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)不会产生任何结果。但是,即使在ptr_Font后将TTF_CloseFont(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);

1 个答案:

答案 0 :(得分:2)

此通话

ptr_Font = TTF_OpenFontRW(ptr_str_rwops2, 1, 72);

告诉TTF处理RWOps流(这就是1的意思)。您不必关闭该流,因为对TTF_CloseFont()的调用会做到这一点。不过,您 DO 必须释放ptr_mem_buff,因为RWOps流不会这样做。