c语言 - 为什么瓦尔格林德认为这段记忆是"definitely lost"?



Valgrind报告纹理*tex肯定丢失了。但我把这个指针保存在mtl->tex中,以便稍后释放。以下是来自valgrind的详细信息:

==17191==1个块中的4个字节在1的丢失记录1中肯定丢失==17191==在0x4C2ABD0:malloc(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)==17191==通过0x4005FA:assignEx(test.c:30)===17191===通过0x400689:main(test.c:47)

这是代码(MCVE):

#include <stdlib.h>
#include <string.h>
typedef struct Tex {
    int a;
} Tex;
typedef struct MTL {
    char *textureFilename;
    struct Tex *tex;
} MTL;
void freeMtl(MTL *mtl) {
    if(!mtl) return;
    if(mtl->tex) free(mtl->tex);
    free(mtl);
}
void doStuff(Tex *tex) {
    tex->a = 5;
}
char err_is_error_set() {
    return 0;
}
void assignTex(MTL *mtl) {
    if(strlen(mtl->textureFilename) != 0) {
        Tex *tex = (Tex*)malloc(sizeof(Tex));
        memset(tex, 0, sizeof(Tex));
        doStuff(tex);
        if(err_is_error_set()) {
            return;
        }
        mtl->tex = tex;
    }
}
int main(int argc, char **argv) {
    MTL *mtl = (MTL*)malloc(sizeof(MTL));
    memset(mtl, 0, sizeof(MTL));
    mtl->textureFilename = "Test";
    assignTex(mtl);
    assignTex(mtl);
    freeMtl(mtl);
    return 0;
}

为什么它肯定丢失了?

例如,如果发生错误,则由于此代码而导致内存泄漏

    bmp_load_bitmap(bmp, mtl->textureFilename, 1/*flip vertically*/);
    if(err_is_error_set()) {
        return 0;
    }

bmp未被释放。

同样的情况也出现在这个代码片段中

    tex_create_texture(tex);
    if(err_is_error_set()) {
        return 0;
    }

此外,检查内存分配是否成功也会更安全。

如果在程序完成后给定的指针没有释放,Valgrind会给出"肯定丢失"的消息。在我的案例中,错误是在代码tex的后面被分配了新值,而之前的值被泄露了(assignTex(mtl)调用了两次)。

相关内容

  • 没有找到相关文章

最新更新