从指针的QList中删除元素

时间:2012-08-12 20:59:03

标签: c++ qt4 qlist

我有一个QList变量。如何从X索引开始擦除所有元素并删除所有子元素N元素还要释放内存?

1 个答案:

答案 0 :(得分:1)

首先,您不应该使用MyClass*来“拥有”(即控制其生命周期)MyClass的实例。因此,MyClass*的列表也不应该“拥有”MyClass的任何实例。因此,您不会将delete运算符与任何这些指针一起使用(并且智能指针实现之外的流浪delete几乎总会引起一些人的注意。)

QList实际上是针对类似用例而优化的类型。 QList<MyClass>将在内部存储MyClass*的动态数组(如果MyClass大于指针),因此重新排序和扩展列表可能更便宜。但是,如果您需要从列表中删除元素而不删除它们,则应使用QList<unique_ptr<MyClass>>或类似内容。无论哪种方式,你都不必担心物体的寿命;你只需要从列表中删除它们。

现在我说过,有一些有用的STL习语有助于实现你想要的东西,而且它们也适用于(大多数)Qt容器(编辑:修复了删除,添加了一些有用的评论):

QList<MyClass*> myList; //TODO FIXME XXX: clarify mentioned ownership issues
assert(X + N <= myList.size());

// this is the range of objects we want to remove and delete
// (N elements, starting from index X)
auto range_begin = myList.begin() + X,
     range_end = range_begin + N;
// delete each object in range
std::for_each(range_begin, range_end, [](MyClass* ptr) { delete ptr; });
// remove them from the list
myList.erase(range_begin, range_end);

如果您打算在myList[X - 1]之后删除所有元素,那就更简单了(简而言之,将range_end替换为myList.end())。