Qt list.clear() 它会破坏对象的吗?

Qt list.clear() does it destroy the object's?

本文关键字:对象 clear list Qt      更新时间:2023-10-16

假设我有以下列表:

QList<Type*> list;
list.add(new Type());
list.add(new Type());
list.add(new Type());
list.add(new Type());
list.add(new Type());
list.add(new Type());

如果我想清空列表,我可以调用list.clear()

它是否会自动删除每个指针,或者我是否必须做以下操作来防止内存泄漏:

foreach (Type* t, list) delete t;
list.clear();

不,它只是从列表中删除它们。你必须自己删除它。您可以在这里找到要确保的实现:

template <typename T>
Q_OUTOFLINE_TEMPLATE void QList<T>::clear()
{
    *this = QList<T>();
}

,这里的文档说它只是从列表中删除它们,但它没有删除:

空白QList: clear ()

从列表中删除所有项。

如果您想删除它们,我建议使用以下算法:

void qDeleteAll(ForwardIterator begin, ForwardIterator end)

使用c++ delete操作符删除[begin, end)范围内的所有项。项目类型必须是指针类型(例如,QWidget *)。

的例子:

QList<Employee *> list;
list.append(new Employee("Blackpool", "Stephen"));
list.append(new Employee("Twist", "Oliver"));
qDeleteAll(list.begin(), list.end());
list.clear();

如果您希望它们自动销毁,那么您需要手动删除它们或在列表

中存储智能指针(std::unique_ptr<Type>, QPointer<Type>(如果Type是QObject),…)