Can anyone please explain me why this c++ code crashes (actually it doesn't crash instead valgrind complains about invalid memory access).
The idea is simple. Controler creates a few workers. Every worker gets functor object which erases this worker once it has done its job. Can anyone please present some solution?
typedef boost::function<void()> Callback;
struct Worker
{
void start(Callback onFinnish)
{
// Called when finnished working
onFinnish();
}
};
typedef boost::shared_ptr<Worker> WorkerPtr;
struct Controler
{
void start()
{
for(int i = 0; i < 5; ++i)
{
auto workerPtr = boost::make_shared<Worker>();
workers.insert(workerPtr);
}
for(const auto &workerPtr: workers)
{
workerPtr->start(
[this, workerPtr] ()
{
workers.erase(workerPtr);
if(workers.size() == 0)
{
std::cout << "All workers done!" << std::endl;
}
}
);
}
}
std::set<WorkerPtr> workers;
};
// Somewhere in code
Controler c; c.start();
EDIT AFTER COMMENTS: I implemented the for auto loop like this and now it works:
for(auto workerIt = workers.begin(); workerIt != workers.end();)
{
auto nextWorker = workerIt; ++nextWorker;
(*workerIt)->start(
[this, workerIt] ()
{
workers.erase(workerIt);
if(workers.empty())
{
onWorkersDone();
}
}
);
workerIt = nextWorker;
}