我有一个std::list
的Entity
对象(屏幕上的对象)。在一个类中EntityContainer
,我有一个指向不同实体的指针列表。当aEntityContainer
被破坏时,我也希望该列表中的所有实体也被破坏。如何做到这一点,同时还避免了导致删除列表成员的迭代器错误?
EntityContainer::~EntityContainer()
{
// Destroy children
int numChildren = children.size();
for (int i = 0; i < numChildren; i++)
{
Entity*& child = children.back();
delete child;
}
}
上面的内容在std :: list :: clear()中导致了空指针访问冲突,该冲突是在销毁时调用的EntityContainer
,因为它是该对象的成员变量。我相信这是因为我已经删除了其列表中的对象,因此,当删除它们时,它当然会尝试访问它们。但是,我的问题是,如果仅保留它,并允许列表clear()
而不显式删除其中的对象,则永远不会调用它们的析构函数。我只能假设这是因为列表仅破坏列表中的指针,而不破坏指针指向的对象。不过,这主要是作为假设-我可能是错的。你会怎么办?
假设children
定义为
std::list<Entity *> children;
您可以delete
使用以下元素:
for(auto&& child : children) {
delete child;
}
children.clear(); // not really needed since this code is in the destructor
使迭代器失效没有问题,因为您实际上并没有从中删除任何元素list
,而只是破坏了列表元素指向的对象。该list
会还含有相同数量的元素后for
声明中完成,只有他们会在该点处无效的内存被人指指点点。
但实际上,不要使用原始指针的容器。定义children
为
std::list<std::unique_ptr<Entity>> children;
然后您可以摆脱析构函数的定义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句