如何正确释放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 流不会那样做。
我按照 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 流不会那样做。