我有一个程序从文件读取并将项目存储在队列中然后将它们打印出来。我从valgrind得到这个:
HEAP SUMMARY:
in use at exit: 302 bytes in 14 blocks
total heap usage: 30 allocs, 16 frees, 1,230 bytes allocated
302 bytes in 14 blocks are definitely lost in loss record 1 of 1
at 0x4A05FDE: malloc (vg_replace_malloc.c:236)
by 0x372167FB41: strdup (strdup.c:43)
by 0x400A6A: addtoqueue(main.c:30)
by 0x400B5A: addfiletoqueue(main.c:45)
by 0x400C27: main (main.c:62)
LEAK SUMMARY:
definitely lost: 302 bytes in 14 blocks
indirectly lost: 0 bytes in 0 blocks
possibly lost: 0 bytes in 0 blocks
still reachable: 0 bytes in 0 blocks
suppressed: 0 bytes in 0 blocks
main.c的第62行
addfiletoqueue (queue, argv[argi]);
main.c的第45行
addtoqueue (queue, file, filename);
main.c第30行
readline = strdup (buffer);
assert (readline != NULL);
queue_add (queue, readline);
我需要免费阅读吗?
答案 0 :(得分:5)
是的,strdup()
动态分配您必须free()
的内存。从链接的参考页面:
strdup()函数返回一个指向新字符串的指针,该字符串是字符串s的副本。 使用malloc(3)获取新字符串的内存,可以使用free(3)释放。
答案 1 :(得分:5)
我需要免费阅读吗?
是。 strdup
free
表示它为其返回值动态分配内存。因此,您必须稍后在程序中的某个地方致电{{1}}。
答案 2 :(得分:4)
是的,你需要在使用它时将其释放。
这可能不在addfiletoqueue()
中,但在程序退出时。然而,诊断说内存“肯定丢失”意味着可能存在更多问题,也许你会丢失指针。
基本上strdup()
只是为你调用malloc()
和strcpy()
,所以当你完成使用时,它会从你需要free()
的堆中分配内存。
此外,readline
是一个非常糟糕的变量名称,因为它也是一个非常标准化的function name。
答案 3 :(得分:1)
strdup()函数返回一个指向新字符串的指针,该字符串是重复的 字符串s。使用malloc(3)获取新字符串的内存 可以用free(3)
释放http://www.kernel.org/doc/man-pages/online/pages/man3/strdup.3.html
Valgrind“绝对输掉了损失记录”显示你的代码泄漏内存!所以你需要从valgrind处理这样的错误......