首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Freetype2 FT_Load_Char内存泄漏

Freetype2 FT_Load_Char内存泄漏
EN

Stack Overflow用户
提问于 2013-07-14 13:41:47
回答 1查看 1.3K关注 0票数 1

我正在使用目视检漏器搜索我的程序内存泄漏,无法找到如何消除FT_Load_Char泄漏的方法,而且文档也没有提到任何关于GlyphSlot内存释放的信息。

这里是我的代码片段,在这里我们得到了大约350个字节的泄漏。

代码语言:javascript
运行
复制
// creating ascii symbol map
for (int i = 32; i < 128; i++) {
    if (FT_Load_Char(face, i, FT_LOAD_RENDER)) { // leak comes from here
        fprintf(stderr, "Loading character %c failed!\n", i);
        continue;
    }

    glTexSubImage2D(GL_TEXTURE_2D, 0, ox, oy, g->bitmap.width, g->bitmap.rows, 
        GL_ALPHA, GL_UNSIGNED_BYTE, g->bitmap.buffer);

    float ax = g->advance.x >> 6;
    float ay = ay = g->advance.y >> 6;

    float bw = g->bitmap.width;
    float bh = g->bitmap.rows;

    float bl = g->bitmap_left;
    float bt = g->bitmap_top;

    m_GlyphMap[i] = Glyph(ax,ay, bw, bh, bl, bt, ox, oy);

    ox += g->bitmap.width + 1;

    // there should be some sort of deallociation...
}

所以主要的问题是:是否有一些函数来释放我所缺少的GlyphSlot?或者是自由类型的错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-28 08:26:56

请确保在关闭程序或停止使用免费类型后调用FT_Done_FreeType(lib_);。如果不是这样的话,那么确保您使用的是最新的自由类型版本。我有几乎相同的循环,它在Windows8 x64上运行得很好。这是我的密码:

代码语言:javascript
运行
复制
for (UINT32 i = 0; i < text.length(); i++) {
    err_ = FT_Load_Char(face_, text[i], FT_LOAD_RENDER);
    if (err_) {
        LOGW("Unable to select, load and render character."
            " Error code: %d", err_);
        continue;
    }
    FT_Bitmap bitmap = glyphSlot->bitmap;
    FT_UInt glyphIndex = FT_Get_Char_Index(face_, text[i]);
    err_ = FT_Get_Kerning(face_, previous, glyphIndex,
        FT_KERNING_DEFAULT, &delta);
    if (err_) {
        LOGW("Unable to get kerning for character."
            " Error code: %d", err_);
        continue;
    }
    Glyph tmp;
    tmp.kerningOffset = delta.x >> 6;
    tmp.buffer = new UINT8[bitmap.rows * bitmap.width];
    memcpy(tmp.buffer, bitmap.buffer, bitmap.rows * bitmap.width);
    tmp.height = bitmap.rows;
    tmp.width = bitmap.width;
    tmp.offsetLeft = glyphSlot->bitmap_left;
    if (tmp.offsetLeft < 0) {
        tmp.offsetLeft = 0;
    }
    tmp.offsetTop = glyphSlot->bitmap_top;
    tmp.advanceX = glyphSlot->advance.x >> 6;
    tmp.advanceY = glyphSlot->advance.y >> 6;
    glyphs.push_back(tmp);
    previous = glyphIndex;
    width += tmp.advanceX + tmp.kerningOffset;
}

此外,如果单独分配符号缓冲区,请不要忘记:

代码语言:javascript
运行
复制
for (SIZE i = 0; i < glyphs.size(); i++) {
    Glyph g = glyphs[i];
    delete [] g.buffer;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17639917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档