2013-07-14 83 views
0

我使用Visual leak detector狩獵我的程序內存泄漏和無法找到如何擺脫FT_Load_Char泄漏,也文件並沒有說明GlyphSlot的內存deallociation什麼..對FreeType2 FT_Load_Char內存泄漏

這裏是我的代碼snipplet其中w得到約350字節的泄漏。

// 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?還是它在Freetype中的錯誤?

回答

2

確保您致電FT_Done_FreeType(lib_);在關閉程序或停止使用freetype後,請鍵入。如果情況並非如此,請確保您使用的是最新的freetype版本。我有幾乎相同的循環,它在Windows 8 x64上工作得很好。這裏是我的代碼:

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; 
} 

也不要忘記,如果您單獨分配他們刪除符號緩衝區:

for (SIZE i = 0; i < glyphs.size(); i++) { 
    Glyph g = glyphs[i]; 
    delete [] g.buffer; 
}