Windows中的内存泄漏pthread。 `pthread_join`不释放内存

时间:2016-12-09 09:56:41

标签: c++11 memory-leaks pthreads pthread-join pthreads-win32

简单的测试:

void testMemoryLeak_PthreadCreateJoin(void)
{
   auto taskFunction = [](void*args) -> void*
   {
      return nullptr;
   };
   pthread_t pth;
   int err = pthread_create(&pth, /*attr*/nullptr, taskFunction, /*args*/nullptr);
   pthread_join(pth, nullptr);
}

void main(void)
{
   _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
   testMemoryLeak_PthreadCreateJoin();
   testMemoryLeak_PthreadCreateJoin();
   testMemoryLeak_PthreadCreateJoin();
   testMemoryLeak_PthreadCreateJoin();
}

Here说:

  

线程是已分配的资源,您在退出之前没有释放它。你应该致电pthread_join;这也可以消除你的hackish和不正确的睡眠循环的需要。

     

有可能即使你解决了这个问题,valgrind仍然会看到“泄漏”,因为POSIX线程的一些实现(我猜你正在使用glibc / NPTL)缓存并重用线程资源而不是完全释放它们。我不确定valgrind是否可以解决这个问题。

但我已经使用pthread_join了。我使用VS2015及其堆分析器。问题可能在pthread我的具体实施中吗?我用Dongsheng Song的PAL

导致内存泄漏:

Detected memory leaks!
Dumping objects ->
{104} normal block at 0x007742C0, 24 bytes long.
 Data: <     X          > D8 00 00 00 E0 58 20 00 00 00 00 00 00 00 00 00 
{101} normal block at 0x00774398, 24 bytes long.
 Data: <     X          > D8 00 00 00 E0 58 20 00 00 00 00 00 00 00 00 00 
{98} normal block at 0x00774038, 24 bytes long.
 Data: <     X          > D8 00 00 00 E0 58 20 00 00 00 00 00 00 00 00 00 
{95} normal block at 0x00774860, 24 bytes long.
 Data: <     X          > D8 00 00 00 E0 58 20 00 00 00 00 00 00 00 00 00 
Object dump complete.
每个pthread

24个字节。 pthread_join()必须释放记忆,但事实并非如此。所以我认为实施是错误的。请确认或解释。

1 个答案:

答案 0 :(得分:0)

如果要追踪分配点,请参阅_CrtSetAllocHook - 您可以设置自己的分配挂钩,并检查堆栈中是否存在泄漏的块。但是,为了带来任何好处,您需要POSIX实现的调试版本才能正确查看堆栈。然后你可以尝试实际修补它,以便释放内存。