在循环遍历容器的时候,假如容器里面存的是动态对象的指针,我们就不能简单地移除掉此容器元素,还需要把此指针指向的对象 delete 掉。
但随着业务的增长,循环中我们需要对次对象执行大量的操作,这种情形下,我们往往会延迟delete掉此对象。那么有什么方案可以实现呢?
此处介绍的方案是:
- 将对象指针托管给 unique_ptr ,并存入一个set
- 将元素从容器中删除
- 循环结束后,clear set
除非你的业务逻辑依赖对象的析构函数,这种方法和直接delete对象不会存在本质上的差别。所执行的逻辑语义完全一致。参考如下代码:
std::set<std::unique_ptr<Obj>> delay_remove_obj_set;
std::set<Obj *> obj_list;
// ...
for (auto it = obj_list.begin(); it != obj_list.end())
{
if (...)
{
// erase
delay_remove_obj_set.insert(*it);
it = obj_list(it);
}
else
{
it->Update();
++it;
}
}
delay_remove_obj_set.clear();