首页 > 解决方案 > 导致线程释放内存泄漏?

问题描述

我有一个多线程代码。这是我的代码的一个简单示例:

void SomeClass::ExampleForThread2()
{
  m_thread_ptr = std::make_unique<std::thread>([=]() {
    while (! m_stop)
    {
      try
      {
        // ... do work
      }
      catch (...)
      {
        // ...
      }
    }
#pragma messsage(__DBG__"TODO: not known if release results in a mem leak. Please investigate.")
    //m_thread_ptr.reset(); // now exception will be raised during destruction of std::thread
    m_thread_ptr.release(); // no exception. Will there be a Memory leak for std::thread ?
    });
}

如果 m_stop 为真,则 while 循环停止。请问thread2比自动清理吗?在那种情况下,我可以释放并且没有内存泄漏。但这是真的吗?

我现在的答案是:

void SomeClass::ExampleForThread2()
{
if (m_thread_ptr != nullptr)
{
   if (m_thread_ptr->joinable())
   {
      m_tread_ptr->join()
   }  
}
.......

我删除了这部分:

#pragma messsage(__DBG__"TODO: not known if release results in a mem leak. Please investigate.")
    //m_thread_ptr.reset(); // now exception will be raised during destruction of std::thread
    m_thread_ptr.release(); // no exception. Will there be a Memory leak for std::thread ?
    });

该函数是单线程的,不需要锁。

标签: c++multithreadingmemory-leaks

解决方案


m_thread_ptr.reset当它仍然可以连接时,将尝试销毁您的线程对象。这是对std::terminate.
m_thread_ptr.release是内存泄漏,是的:您从unique_ptr对象中提取指针,然后将其放在地板上。

只需让函数“用完”,让SomeClass析构函数清理剩余的线程状态。


推荐阅读