我最近了解到 std::thread 的这种不幸行为
void func(std::string param);
void evil()
{
char buff[4096];
sprintf(buff,"%i",rand());
std::thread t(func, buff);
t.detach();
}
(这里的问题是缓冲区到期和从 char* 到 std::string 的转换是在调用线程中完成的)解决方案是创建这样的线程:
std::thread t(func, std::string(buff));
但我的问题是 ISO 选择这种行为的原因是什么(尽管当你想到它仍然是许多错误的潜在来源时,这是完全合乎逻辑的......)。