当销毁包含该线程

时间:2018-03-18 11:35:02

标签: c++ multithreading class destructor delete-operator

我有一个具有属性线程的类。它看起来像这样。

class myClass {
public:
      myClass(ClassB * x)  { 
           myThread = thread(&myClass::run, this); 
           classB = x;
      }
      ~myClass() { myThread.detach(); }
      void run() {
           while (something) {
              // do your work.
           }
           classB->endThisObject(this); 
      }
private:
    thread myThread;
    ClassB * classB;        
}

我的classB看起来像这样。

ClassB {
public:
       endThisObject(myClass * x) { delete x; }
}

所以基本上myThread的最后一个操作是使用另一个对象来破坏自己。这可能会导致很多麻烦吗?我正在测试我的代码并且我没有泄漏,但这对我来说似乎有点不对。

1 个答案:

答案 0 :(得分:1)

除了线程,只需看看这段代码:

B b;
MyClass myclass(&b);

B实例会盲目地,无情地在指向未使用new创建的对象的指针上调用delete。

此外,应该注意的是,您的run函数基本上是调用delete this,这是合法的,但(至少)有点争议(例如,请参阅here)。 / p>

我会给MyClass类一个startjoin方法,如下所示:

   void MyClass::start()   
   {
       myThread = thread(&myClass::run, this);
   } 

   void MyClass::join()   
   {
       myThread.join();
   } 

通过这些方式,您可以从类外部控制线程执行,并以更简单,更安全的方式管理内存:

   MyClass myclass;
   myclass.start();
   myclass.join();
   //no need to call delete, here

   auto p = std::make_unique<MyClass>();
   p->start();
   p->join();
   //done (and no delete, again)