tex 中以便稍后释放它。以下是来自 valgrind 的详细消息: ==17191== 4 bytes in 1 b-6ren">
gpt4 book ai didi

c - 为什么 Valgrind 认为这个内存是 "definitely lost"?

转载 作者:行者123 更新时间:2023-11-30 20:23:23 26 4
gpt4 key购买 nike

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

==17191== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==17191== at 0x4C2ABD0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==17191== by 0x4005FA: assignTex (test.c:30) ==17191== by 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;
}

而且检查内存分配是否成功会更安全。

关于c - 为什么 Valgrind 认为这个内存是 "definitely lost"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36218194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com