std :: vector :: erase/remove_if导致nullptr

Dre*_*kes 0 c++ stdvector

我有一个std::shared_ptr<MotionTask>对象矢量,我偶尔需要清理它.

// this assert passes
assert(std::all_of(d_tasks.begin(), d_tasks.end(),
       [](shared_ptr<MotionTask> task) { return bool(task); }));

// Remove any committed tasks for which the corresponding module has completed
d_tasks.erase(
  remove_if(
    d_tasks.begin(), 
    d_tasks.end(),
    [module](shared_ptr<MotionTask> const& task)
    {
      return task->isCommitted() && task->getModule() == module;
    }
  )
);

// this assert fails
assert(std::all_of(d_tasks.begin(), d_tasks.end(),
       [](shared_ptr<MotionTask> task) { return bool(task); }));
Run Code Online (Sandbox Code Playgroud)

最后一个assert是失败的,因为在任务的向量中,一个是null(false).

我不明白如何调用erase会使成员无效.我无法在单元测试中重现这一点.

是否有可以从上面的代码中看到的解释,如果没有,我可以尝试调试这个?

jua*_*nza 5

您正在调用单迭代器std::vector::erase重载.你需要两个迭代器版本:

d_tasks.erase(
  remove_if(
    d_tasks.begin(), 
    d_tasks.end(),
    [module](shared_ptr<MotionTask> const& task)
    {
      return task->isCommitted() && task->getModule() == module;
    }
  ),
  d_tasks.end() // HERE!!
);
Run Code Online (Sandbox Code Playgroud)

单个迭代器版本删除单个元素,而擦除删除习惯用法需要删除范围.这是使用两个迭代器版本实现的.