私は最近、 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 がこの動作を選択する理由は何なのかということです (これは、依然として多くのバグの潜在的な原因であると考えると完全に論理的ですが...)。