我有一个QList变量。如何从X索引开始擦除所有元素并删除所有子元素N元素还要释放内存?
答案 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()
)。