1

我有一个程序,它从文件中读取并将项目存储在队列中,然后将它们打印出来。我从 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);

我需要免费阅读线吗?

4

4 回答 4

5

是的,strdup()动态分配你必须的内存free()。从链接的参考页面:

strdup() 函数返回一个指向新字符串的指针,该字符串是字符串 s 的副本。新字符串的内存使用 malloc(3) 获得,并且可以使用 free(3) 释放。

于 2013-02-25T09:36:05.147 回答
5

我需要免费阅读线吗?

是的。手册页strdup声明它为其返回值动态分配内存。因此,您必须free稍后在程序中的某个地方调用它。

于 2013-02-25T09:36:10.947 回答
4

是的,您需要在使用完毕后释放它。

这可能不在 中addfiletoqueue(),而是在程序退出时。但是,诊断说内存“肯定丢失”意味着可能存在更多问题,也许您在此过程中丢失了指针。

基本上strdup()只是为你调用malloc(),所以它是在你完成使用时strcpy()从堆中分配内存。free()

此外,readline这是一个非常糟糕的变量名,因为它也是一个非常标准化的函数名

于 2013-02-25T09:36:27.640 回答
1

strdup() 函数返回一个指向新字符串的指针,该字符串是字符串 s 的副本。新字符串的内存使用 malloc(3) 获得,并且可以使用 free(3) 释放

http://www.kernel.org/doc/man-pages/online/pages/man3/strdup.3.html

Valgrind“绝对丢失丢失记录”显示您的代码泄漏内存!因此,您需要注意 valgrind 的此类错误...

于 2013-02-25T09:38:00.187 回答