2

我有一个 QList 变量。如何擦除从 X 索引开始的所有元素并删除所有后续 N 元素以同时释放内存?

4

1 回答 1

1

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

QList实际上是针对类似用例优化的类型。AQList<MyClass>将在内部存储一个动态数组MyClass*(如果MyClass大于指针),因此重新排序和扩展列表可能更便宜。但是,如果您需要从列表中删除元素而不删除它们,您应该使用 aQList<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_endmyList.end()),它甚至更简单。

于 2012-08-12T21:32:02.197 回答