我有一个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
会使成员无效.我无法在单元测试中重现这一点.
是否有可以从上面的代码中看到的解释,如果没有,我可以尝试调试这个?
您正在调用单迭代器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)
单个迭代器版本删除单个元素,而擦除删除习惯用法需要删除范围.这是使用两个迭代器版本实现的.