我遇到了std :: list的问题。
std::list<Component*> mComponents;
//add some pointer in it
Component * comp = getComponent("positionComponent");
mComponents.remove(comp);
由于某种原因,它调用comp指针的析构函数但不删除它;通过析构函数删除的项目将被删除,而列表中的所有其他项目保持不变。什么可能导致这种行为?
答案 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
是另一种选择。