首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FreeImage_Load内存泄漏

FreeImage_Load内存泄漏
EN

Stack Overflow用户
提问于 2014-02-12 23:23:19
回答 1查看 2K关注 0票数 1

瓦伦向我报告了我的纹理加载方法中的一些内存泄漏。我将其追溯到一个方法,但它似乎是FreeImage库本身的一个漏洞?

(内存泄漏的其余部分也都来自FreeImage_Load,这里省略了)

代码语言:javascript
复制
==4295== 4,320,746 (8 direct, 4,320,738 indirect) bytes in 1 blocks are definitely lost in loss record 210 of 210
==4295==    at 0x4C2CD7B: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4295==    by 0x85148C: FreeImage_AllocateHeaderT (in /tmp/lab)
==4295==    by 0x851913: FreeImage_AllocateHeader (in /tmp/lab)
==4295==    by 0x8698AE: Load(FreeImageIO*, void*, int, int, void*) (in /tmp/lab)
==4295==    by 0x855B44: FreeImage_LoadFromHandle (in /tmp/lab)
==4295==    by 0x855BE0: FreeImage_Load (in /tmp/lab)
==4295==    by 0x41433F: Texture::LoadTexture(std::string, float, float) (Texture.cpp:7)
==4295==    by 0x417E2B: World::LoadTextures() (World.cpp:27)
==4295==    by 0x4119E5: main (project_main.cpp:217)
==4295== 
==4295== LEAK SUMMARY:
==4295==    definitely lost: 12,328 bytes in 17 blocks
==4295==    indirectly lost: 15,095,237 bytes in 554 blocks
==4295==      possibly lost: 845,677 bytes in 93 blocks
==4295==    still reachable: 47,631 bytes in 425 blocks
==4295==         suppressed: 0 bytes in 0 blocks

这似乎表明该漏洞位于纹理::LoadTexture方法中,下面是该方法:

代码语言:javascript
复制
GLuint Texture::LoadTexture(std::string filename, float width, float height){   

    //Load Image
    FREE_IMAGE_FORMAT format = FreeImage_GetFileType(filename.c_str(), 0);      
    FIBITMAP *image = FreeImage_ConvertTo32Bits(FreeImage_Load(format, filename.c_str()));
    BYTE *bits = FreeImage_GetBits(image);

    //Get width, height, bitnumber
    int w = FreeImage_GetWidth(image);
    int h = FreeImage_GetHeight(image);
    int nBPP =  FreeImage_GetBPP(image);

    std::cout<<filename<<" "<<w<<"*"<<h<< " " << nBPP << std::endl;

    //Generate texture references
    GLuint textureID;
    glGenTextures(1, &textureID);
    //Bind
    glBindTexture(GL_TEXTURE_2D, textureID);
    //Set parameters
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);       
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

    //Generate actual texture from image data (mipmaps)
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, w, h, GL_BGRA, GL_UNSIGNED_BYTE, bits); 

    //Unload image
    FreeImage_Unload(image);            

    //Add texture info to a map
    textures.insert(std::pair<GLuint, TextureInfo>(textureID, TextureInfo(textureID, w, h, nBPP)));     

    if (glGetError()) {
        std::cout << "There was an error loading the texture" << std::endl;
    }   

    //Return OpenGL textureID
    return textureID;
}

任何帮助,任何人都可以给予赞赏,不知道如何进行调试这一个。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-13 00:14:45

我发现这句话有个问题:

代码语言:javascript
复制
FIBITMAP *image = FreeImage_ConvertTo32Bits(FreeImage_Load(format, filename.c_str()));

FreeImage_Load()调用返回必须通过调用FreeImage_Unload()释放的FIBITMAP *。在您的代码中,您将返回的指针视为一个临时值,并将其传递给FreeImage_ConvertTo32Bits(),但您不会将它保存到任何地方。您泄漏内存是因为您丢失了指针,并且无法再释放资源。

注意,FreeImage_ConvertTo32Bits()复制了位图,所以除了原始的FIBITMAP *之外,还必须调用FreeImage_Unload()来释放它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21742092

复制
相关文章

相似问题

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