【问题标题】:Memory leakage in windows pthread. `pthread_join` does not deallocate memoryWindows pthread 中的内存泄漏。 `pthread_join` 不会释放内存
【发布时间】:2017-04-24 18:26:32
【问题描述】:

简单测试:

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;这也将消除您对骇人听闻和不正确的睡眠循环的需要。

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

但我已经使用pthread_join。我使用 VS2015 及其堆分析器。问题可能出在pthread 我的特定实现中吗?我用的是宋东升的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() 必须释放内存,但它没有。所以我想实现是错误的。请确认或反驳。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我认为CrtSetDbgFlag 足以进行分析。我不会调试pthreads。知道它有问题或者我在某个地方承认错误就足够了。
    猜你喜欢
    • 2012-06-08
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多