我有一个具有属性线程的类。它看起来像这样。
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的最后一个操作是使用另一个对象来破坏自己。这可能会导致很多麻烦吗?我正在测试我的代码并且我没有泄漏,但这对我来说似乎有点不对。
答案 0 :(得分:1)
除了线程,只需看看这段代码:
B b;
MyClass myclass(&b);
B
实例会盲目地,无情地在指向未使用new
创建的对象的指针上调用delete。
此外,应该注意的是,您的run
函数基本上是调用delete this
,这是合法的,但(至少)有点争议(例如,请参阅here)。 / p>
我会给MyClass类一个start
和join
方法,如下所示:
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)