std :: list.remove正在调用析构函数但不删除它

时间:2013-11-27 00:42:26

标签: c++ c++11

我遇到了std :: list的问题。

std::list<Component*> mComponents;
//add some pointer in it
Component * comp = getComponent("positionComponent");
mComponents.remove(comp);

由于某种原因,它调用comp指针的析构函数但不删除它;通过析构函数删除的项目将被删除,而列表中的所有其他项目保持不变。什么可能导致这种行为?

1 个答案:

答案 0 :(得分:6)

调用list.remove会调用包含类型的析构函数,但在您的情况下,正在调用Component *的析构函数,这是一个无操作符。在删除之前,您必须手动找到该项目并delete

auto item = std::find(mComponents.begin(), mComponents.end(), comp);
if(item != mComponents.end()) {
  delete *item;
  mComponents.remove(item);
}

这就是为什么不建议将原始指针粘贴在标准容器中的原因。您应该使用std::list<std::unique_ptr<Component>>代替。 unique_ptr会为您调用托管对象上的delete

或者,如果您使用的是前C ++ 11编译器,boost::ptr_list是另一种选择。