释放 std::thread* 堆分配内存的正确方法是什么?

What is the correct way of freeing std::thread* heap allocated memory?

我正在 class 中声明一个指向线程的指针。

class A{
   std::thread*    m_pThread;   
   bool StartThread();
   UINT DisableThread();
}

下面是我如何使用线程调用函数。

bool A::StartThread()
{
    bool mThreadSuccess = false;
    {
       try {
          m_pThread= new std::thread(&A::DisableThread, this);
          mThreadSuccess = true;
      }
      catch (...) {
         m_pDisable = false;
      }

      if(m_pThread)
      {
         m_pThread= nullptr;
      } 
   }
return mThreadSuccess;
}

这是我的线程调用的函数。

UINT A::DisableThread()
{
    //print something here.
    return 0;
}

如果我调用此 StartThread() 函数 10 次。会不会有内存泄漏?

for (i = 0; i<10; i++){
    bool sResult = StartThread();
      if (sResult) {
        m_pAcceptStarted = true;
      }
}

What is the correct way of freeing

m_pThread= new std::thread(&A::DisableThread, this);

释放使用分配 new 创建的非数组对象的正确方法是使用 delete.

避免裸拥有指针并避免不必要的动态分配。该示例未说明对动态存储的任何需求,理想情况下,您应该使用 std::thread 成员而不是指针。

If I call this StartThread() function 10 times. Will it have a memory leak?

即使是一次调用也会导致内存泄漏。当您在此处丢弃指针值时会发生泄漏:

m_pThread= nullptr;

could you add your better solution

这是一个:

auto future = std::async(std::launch::async, &A::DisableThread, this);
// do something while the other task executes in another thread
do_something();
// wait for the thread to finish and get the value returned by A::DisableThread
return future.get()

我个人更喜欢在实际项目中使用线程池,但这个示例应该让您了解如何在没有 new/delete 的情况下处理线程。

#include <iostream>
#include <thread>
#include <vector>

class A
{
public:
    template<typename Fn>
    void CallAsync(Fn fn)
    {
        // put thread in vector
        m_threads.emplace_back(std::thread(fn));
    }

    ~A()
    {
        for (auto& thread : m_threads)
        {
            thread.join();
        }
    }

    void someHandler()
    {
        std::cout << "*";
    };

private:
    std::vector<std::thread> m_threads;
};

int main()
{
    A a;

    for (int i = 0; i < 10; ++i)
    {
        a.CallAsync([&a] { a.someHandler(); });
    }
}