2017-01-10 57 views
1
创建

用新的线程& 删除工作正常吗?用于C++ 11的线程,用新的

Q1。试图通过使用新的新线程是正常的?

Q2,加入后有没有问题删除?

例如

class Myclass { 

private: 
    thread *th; 

public: 
    ~Myclass(){delete th;}; 
    void create_thread(); 
    void thread_func(); 
}; 

Myclass::create_thread() 
{ 
    th = new thread(thread_func, this); 
    th->join(); 
} 

Myclass::thread_func() 
{ 
    while(1){}; 
} 
+3

显示的类[违反三规则](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree)。使用'new'在动态作用域中构建'std :: thread'没有问题,如果它正确完成的话,但这不是正确的方法。花一些时间了解智能指针。 –

+0

你是什么意思*好吧*?是的,你可以做到。不,你可能不应该这样做... –

+0

@SamVarshavchik *没有错* – Yakk

回答

3

A1:这是正常的,thread是一类。它可以是new ed和delete d。

A2:没问题。相反,加入线程后应该调用deletedelete调用对象析构函数,销毁一个可连接的线程调用terminate

你举的例子有一些大的纰漏......

  • 指针被删除,无论它的内容,并且不与nullptr初始化,所以如果你创建一个MyClass对象并摧毁它,而不调用create_thead,您将在未初始化的指针上调用delete

  • thread_func永远不会返回,所以连接永远不会发生,所以create_thead永远不会返回。

0

Q1。试图通过使用新的新线程是正常的?

动态分配线程是可以的。但是,仅仅因为你可以,并不意味着你应该这样做。在这种情况下动态地分配线程没有必要或有利。

一般来说,手动分配内存是不“好”的。几乎没有任何手动内存管理的情况。这很难做到正确。事实上,在你的班级里做得不对。考虑复制时会发生什么。坏事会发生。第二季度销售价格指数为:

Q2。删除加入后没有问题吗?

它不仅是确定delete的指针,必须删除,否则你泄漏内存。该线程在被销毁之前必须已经加入(或分离)。否则,该过程终止。