このコードではリークが発生しています。私はオブジェクトをベクトルとラムダ関数に間違って渡していることを知っていますが、その解決方法は本当にわかりません。コードのレビューと修正を私にお願いしますか?スレッド内のラムダ関数に変数を正しく渡す方法
std::vector<std::thread> threads;
std::vector<std::unique_ptr<FileHandler>> fileHandlers;
for (std::string argument : filesToParse)
{
std::unique_ptr<FileHandler> fileHandler(new FileHandler(argument));
fileHandlers.push_back(std::move(fileHandler));
threads.push_back(std::thread([&fileHandler]()
{
fileHandler->processFile();
}));
}
for(auto i = 0; i < threads.size(); ++i)
{
threads.at(i).join();
fileHandlers.at(i)->mergeMaps(finalMap);
}
'std :: move(fileHandler)'で気をつけてください。すぐ後にアクセスしようとします。最新のファイルハンドラを取得するには、 'fileHandlers.back()'を使ってみてください。 –
移動したハンドラをプッシュバックした後、 'fileHandler'は未指定の状態のままです。これはおそらくそれがもう何も指していないことを意味します。次に、ラムダを、関数の戻り値を超えて保持されているコンテナ内のスレッド内に格納します。したがって、スレッドが結合されると、ラムダ内の 'fileHandler'は、すでに移動された存在しない値へのダングリング参照です(存在したときのyoreの日であっても)。 – bipll