我有一个 vector 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); }));
决赛assert
失败了,因为在任务 vector 中,一个为空(假)。
我不明白怎么调用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!!
);
单个迭代器版本删除单个元素,而删除-删除习惯用法需要删除一个范围。这是使用两个迭代器版本实现的。
关于c++ - std::vector::erase/remove_if 导致 nullptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17015151/