c++ - std::vector::erase/remove_if 导致 nullptr

标签 c++ stdvector

我有一个 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/

相关文章:

c++ - 将 OpenGL 转换为 PNG

c++ - 客户端断开连接时 TCP 套接字选择服务器段错误

c++ - 如何从示例 C 程序发送 HTTP post 请求

c++ - 将 std::vector 转换为 CComSafeArray 的任何快速方法

c++ - 关于指针上 std::vector::push_back 中的 EXC_BAD_ACCESS 错误的问题

python - 使用 python 扩展 C++ 应用程序

c++ - ATL 和来自 scrrun.dll 的类型

c++ - 什么是 std::vector::_emplace_back_slow_path/std::vector::_push_back_slow_path?

c++ - 为什么 vector 的 vector 不能保证是连续的? (或者是吗?)

c++ - 为什么 vector::clear 不从 vector 中删除元素?