当我们通过以下方式将内存中的字体资源导入到 Imgui 中时,
io.Fonts->AddFontFromMemoryTTF(pLock, dwSize, 28.0f, ...);
程序结束时会爆出运行错误错误(通常在 Imgui 内部 HeapFree
处)。
问题分析
从内存导入到 Imgui 中的字体文件在结束的时候不会自动释放,则结束程序执行到 ImGui::DestroyContext();
时就会因为无法释放内存报错,所以需要手动释放字体占用的内存空间。
解决方案
在加入字体前定义 ImFontConfig
,并指定 FontDataOwnedByAtlas
为 false:
ImFontConfig font_cfg;
font_cfg.FontDataOwnedByAtlas = false;
// ...
io.Fonts->AddFontFromMemoryTTF(pLock, dwSize, 28.0f, &font_cfg, io.Fonts->GetGlyphRangesChineseFull());
结束程序时,务必在 ImGui::DestroyContext();
前执行 io.Fonts->Clear();