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

问题描述 投票:2回答:1

我按照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);
c free sdl-2
1个回答
2
投票

这个电话

ptr_Font = TTF_OpenFontRW(ptr_str_rwops2, 1, 72);

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

© www.soinside.com 2019 - 2024. All rights reserved.