我的main函数中有一个事件循环,我想创建一个对象并在对象的成员函数上运行一个线程。但是,我注意到在线程启动之前对象被销毁了。我不明白为什么。
我的代码:
#include <iostream>
#include <thread>
class MyClass {
public:
MyClass(){
std::cout << "MyClass constructor is called" << std::endl;
}
~MyClass(){
std::cout << "MyClass destructor is called" << std::endl;
}
void start(){
std::cout << "MyClass is starting" << std::endl;
}
};
int main()
{
MyClass mine;
std::thread t(&MyClass::start, mine);
t.join();
}
输出:
MyClass constructor is called
MyClass destructor is called
MyClass is starting
MyClass destructor is called
MyClass destructor is called
期望的输出:
MyClass constructor is called
MyClass is starting
MyClass destructor is called
答案 0 :(得分:10)
通过引用传递mine
:std::thread t(&MyClass::start, std::ref(mine));
mine
的类型为MyClass
,表示您按值传递它。所以std::thread
将其副本传递给新创建的主题。
您需要通过引用明确告诉您传递mine
的模板。
答案 1 :(得分:3)
std::thread
在内部创建本地对象并多次调用复制构造函数,并在使用后销毁本地对象。因此,您将获得多个输出MyClass destructor is called
。
如果要检查对象构造的行为,则可以在类中包含复制构造函数。