我正在使用pthread库编写程序。当我使用valgrind --leak-check=full命令运行程序时,出现以下错误描述:

==11784==
==11784== **HEAP SUMMARY:**
==11784==     in use at exit: 4,952 bytes in 18 blocks
==11784==   total heap usage: 1,059 allocs, 1,041 frees, 51,864 bytes allocated
==11784==
==11784== **288 bytes** in 1 blocks are possibly lost in loss record 2 of 3
==11784==    at 0x4C2380C: calloc (vg_replace_malloc.c:467)
==11784==    by 0x4010D2E: _dl_allocate_tls (dl-tls.c:300)
==11784==    by 0x55DC218: **pthread_create**@@GLIBC_2.2.5 (allocatestack.c:570)
==11784==    by 0x401BC0: initdevice(char*) (in /a/fr-01/vol/home/stud/lim/workspace  /Ex3/l)
==11784==    by 0x406D05: main (in /a/fr-01/vol/home/stud/lim/workspace/Ex3/l)
==11784==
==11784== **4,608 bytes** in 16 blocks are possibly lost in loss record 3 of 3
==11784==    at 0x4C2380C: calloc (vg_replace_malloc.c:467)
==11784==    by 0x4010D2E: _dl_allocate_tls (dl-tls.c:300)
==11784==    by 0x55DC218: **pthread_create**@@GLIBC_2.2.5 (allocatestack.c:570)
==11784==    by 0x40268F: write2device(char*, int) (in /a/fr-01/vol/home/stud/lim/workspace/Ex3/l)
==11784==    by 0x406D7B: main (in /a/fr-01/vol/home/stud/lim/workspace/Ex3/l)
==11784==
==11784== **LEAK SUMMARY:**
==11784==    definitely lost: 0 bytes in 0 blocks
==11784==    indirectly lost: 0 bytes in 0 blocks
==11784==      possibly lost: 4,896 bytes in 17 blocks
==11784==    still reachable: 56 bytes in 1 blocks
==11784==         suppressed: 0 bytes in 0 blocks
==11784== Reachable blocks (those to which a pointer was found) are not shown.
==11784== To see them, rerun with: --leak-check=full --show-reachable=yes
==11784==
==11784== For counts of detected and suppressed errors, rerun with: -v
==11784== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 4 from 4)

每次使用某个函数调用pthread_create时,都会在函数末尾调用pthread_exit函数。因此,在确认这不是问题之后,可能是什么问题?

最佳答案

线程的资源不会在终止时立即释放,除非
创建该线程时,其detach state属性设置为PTHREAD_CREATE_DETACHED,或者是否需要调用pthread_detachpthread_t

未分离的线程将保持终止状态,直到其标识符传递给pthread_joinpthread_detach为止。

总结起来,您有三个选择:

  • 创建具有分离属性集(PTHREAD_CREATE_DETACHED属性)的线程
  • 创建后分离线程(通过调用pthread_detach)或
  • 与终止的线程联接以回收它们(通过调用pthread_join)。

  • Hth。

    关于c++ - 使用pthread_create时valgrind内存泄漏错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5610677/

    10-09 13:01