为什么qDeleteAll不会在容器上调用clear

时间:2016-09-06 14:49:36

标签: c++ qt

阅读http://doc.qt.io/qt-4.8/qtalgorithms.html#qDeleteAll的文档,它要求我们在我们的容器上调用.clear。这是为什么?

为什么qDeleteAll不会为我们清除容器?

2 个答案:

答案 0 :(得分:4)

根据http://doc.qt.io/qt-4.8/qtalgorithms.html#qDeleteAll

中的Qt文件
  

请注意,qDeleteAll()不会从容器中删除项目;它只是调用删除它们。

我认为将qDeleteAll()与clear()分离在许多情况下都很有用,因为即使在使用qDeleteAll()删除其项目的已分配内存之后,它也允许您保留容器属性。例如:

{{1}}

如果你在qDeleteAll(hash)之后使用hash.clear(),或者如果hash.clear()被qDeleteAll(hash)隐式调用,那么你将无法在这个例子中检索键和大小

答案 1 :(得分:2)

一个原因是并非每个容器都有相同的方法来清除自己。如果你看一下qDeleteAll的代码,它只需要在传递给它的迭代器之间递增:

template <typename ForwardIterator>
Q_OUTOFLINE_TEMPLATE void qDeleteAll(ForwardIterator begin, ForwardIterator end)
{
    while (begin != end) {
        delete *begin;
        ++begin;
    }
}

不同的容器可以(尽管不一定)有不同的方法来清除自己,这个模板为了完成它的工作不需要知道。