c++ - crtdbg 在使用 sf::Text::setOutlineThickness 时转储内存泄漏

标签 c++ memory-leaks sfml

在 Windows 7 64 位版本上使用 SFML 2.4.2 时,我注意到 sf::Text::setOutlineThickness(float) 存在问题。一旦在程序中使用它,除默认值 0 外,crtdbg 会转储各种字节大小但总是相同数量的内存泄漏。我相信这与字符串的大小有关,如果文本被绘制,并且 if the parameter of setOutlineThickness is accepted , 在这里演示:

/// Initial set-up
sf::Text test;
test.setString("A");
// ... Set charactersize, font, fillcolor, etc ...
test.setOutlineThickness(1);
test.setOutlineColor(sf::Color::Black);

/// Make a drawcall for test later in the program
void Game::draw(sf::RenderTarget & target, sf::RenderStates states) const
{
    target.draw(test, states);
}

这会产生泄漏:

{8601} normal block at 0x0000000005CA5C90, 60 bytes long.
 Data: <                > 03 00 07 00 0B 00 0F 00 13 00 17 00 1B 00 1F 00
{8600} normal block at 0x0000000005E03A20, 120 bytes long.
 Data: <                > 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
{8599} normal block at 0x0000000005E2A680, 960 bytes long.
 Data: <                > 00 00 00 00 80 07 00 00 0D 01 00 00 80 07 00 00
{8598} normal block at 0x0000000005CA36B0, 72 bytes long.
 Data: <        h       > F0 1A 9D 05 00 00 00 00 68 AE 83 DB FE 07 00 00

如果test.setString("B");,仍然有四个 block ,但字节大小不同,因为字符串使用了另一个字符:
68字节、136字节、1088字节、72字节。
最后如果 test.setString("AB");,有 8 个 block 具有预期的大小:

{8667} normal block at 0x0000000005C35D10, 68 bytes long.
 Data: <                > 03 00 07 00 0B 00 0F 00 13 00 17 00 1B 00 1F 00
{8666} normal block at 0x0000000005C61310, 136 bytes long.
 Data: <                > 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
{8665} normal block at 0x000000000325CDE0, 1088 bytes long.
 Data: <                > 00 00 00 00 80 07 00 00 0D 01 00 00 80 07 00 00
{8664} normal block at 0x0000000005C340D0, 72 bytes long.
 Data: <        h       > F0 1A 96 05 00 00 00 00 68 AE B5 DB FE 07 00 00
{8601} normal block at 0x0000000005C35C90, 60 bytes long.
 Data: <                > 03 00 07 00 0B 00 0F 00 13 00 17 00 1B 00 1F 00
{8600} normal block at 0x0000000005D93A20, 120 bytes long.
 Data: <                > 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
{8599} normal block at 0x0000000005DBA680, 960 bytes long.
 Data: <                > 00 00 00 00 80 07 00 00 0D 01 00 00 80 07 00 00
{8598} normal block at 0x0000000005C336B0, 72 bytes long.
 Data: <        h       > F0 1A 96 05 00 00 00 00 68 AE B5 DB FE 07 00 00
  • 我使用 sf::Text 作为类的私有(private)成员,它应该随类一起销毁,但事实似乎并非如此。我错过了什么?
  • 我使用 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);,这是误报吗?
  • 查看函数,sf::Text::setOutlineThickness ,我在这里看不到问题。 A brief documentation .
  • 取决于字符串大小的不同泄漏实际上更像是一种症状,我对轮廓厚度的绘制调用和非默认值一无所知。

最佳答案

看起来 SFML 中确实存在泄漏,位于 Font.cpp#L561

看起来像这样:

FT_Glyph_Stroke(&glyphDesc, stroker, false);

但是根据FT_Glyph_Stroke的文档,其实应该是这样的,所以源字形被破坏了:

FT_Glyph_Stroke(&glyphDesc, stroker, true);

关于c++ - crtdbg 在使用 sf::Text::setOutlineThickness 时转储内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44005355/

相关文章:

c++ - 为什么 std::initializer_list 不是内置语言?

c++ - 模板代码在 G++ 下工作正常,但在 VC++ 下出错

java - Web 应用程序中的内存泄漏

objective-c - 来自 Clang 的 "Leak of returned object"是什么意思?

c++ - SFML 2.4.2 不在 VS 2017 社区中绘制

c++ - 如何将 ASCII 字符串转换为十六进制?

c++ - 无法使用函数指针调用函数

c++ - 这个C++的内存泄漏在哪里?

c++ - 调整 sfml 应用程序的窗口大小

c++ - SFML Sprite std::list