在循環遍歷容器的時候,假如容器裏面存的是動態對象的指針,我們就不能簡單地移除掉此容器元素,還需要把此指針指向的對象 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();