我有std :: list的问题.
std::list<Component*> mComponents;
//add some pointer in it
Component * comp = getComponent("positionComponent");
mComponents.remove(comp);
Run Code Online (Sandbox Code Playgroud)
由于某种原因,它调用comp指针的析构函数但不删除它; 通过析构函数删除的项目将被删除,而列表中的所有其他项目保持不变.什么可以导致这种行为?
调用list.remove确实调用了包含类型的析构函数,但在你的情况下,Component *正在调用析构函数,这是一个无操作.您必须delete在删除之前手动查找该项目.
auto item = std::find(mComponents.begin(), mComponents.end(), comp);
if(item != mComponents.end()) {
delete *item;
mComponents.remove(item);
}
Run Code Online (Sandbox Code Playgroud)
这就是为什么不建议将原始指针粘贴在标准容器中的原因.你应该使用std::list<std::unique_ptr<Component>>.该unique_ptr会打电话delete给你的管理对象.
或者,如果您使用的是预C++ 11编译器,boost::ptr_list则是另一种选择.