如何从QContainer <object *>中正确删除所有内容

时间:2016-09-09 13:53:51

标签: c++ qt

这些是我们在代码中使用的3个版本。我们想要标准化。看起来第二和第三是最快的?但是我们应该在第2个/第3个版本中调用.clear()吗?

第一

qDeleteAll(container);
container.clear();

第二

while (!container.isEmpty())
   container.removeLast();

第3次

while (!container.isEmpty())
   delete container.takeLast();

1 个答案:

答案 0 :(得分:0)

如果您坚持使用拥有 QList<QObject*>,您应该从中获取并创建一个自定义容器,以您期望的方式管理对象的生命周期。 手动资源管理是一个等待发生的错误。避免它。

关于您的替代方案:

qDeleteAll(container);
container.clear();

工作正常。您希望它最快,因为容器从未调整过大。

while (!container.isEmpty())
   container.removeLast();

泄漏所有元素的存储空间。

while (!container.isEmpty())
   delete container.takeLast();

工作正常。你会期望它比第一种选择慢,因为你不断缩小容器。无论如何,这都会有一些开销。

作为替代方案,在现代代码中,您可以使用std::list并按值存储对象:

std::list<MyObject> objects;
objects.emplace_back(...);
...

你也可以使用QObject作为对象容器,毕竟在你销毁它的时候,它会保证处理它们。