问题的产生
调用thread::detch后,程序有可能会在当前调用函数执行完之后才去构造实参对象
隐患:此时函数已经执行结束,栈的空间已经被回收 ,使用已经被释放的内存去构造对象,会造成不可预估的行为,未定义行为
- 先自定义一个结构体,只需要编写构造函数观察
class A {
int YourVar;
public:
A(int value){
std::cout<<"构造函数"<<std::endl;
}
virtual ~A(){
std::cout<<"析构函数"<<std::endl;
}
};
- 定义线程函数
void fun(const A obj){
}
int main()
{
int value = 1;//
std::thread th(fun,value);
th.detach();
return 0;
}
可以看出,此时对象并没有构造就已经结束了
解决方案
使用临时对象包装一下,此时一定可以在主线程结束之前构造完毕,确保子线程可以正常安全运行