在 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/