删除QMap中的所有值

Deleting all values from a QMap

本文关键字:QMap 删除      更新时间:2023-10-16

我有一个QMap由指向类对象的指针组成,使用new分配。我需要删除所有这些指针。用QMap做这件事的正确方法是什么?我可以这样做:

QList<ClassName*> allVals = map.values();
for (QList<ClassName*>::iterator it = allVals.begin(), endIt = allVals.end(); it != endIt; ++it) {
    delete *it;
}

最好的方法是使用qDeleteAll(…):

qDeleteAll( map );  //  deletes all the values stored in "map"
map.clear();        //  removes all items from the map

qDeleteAll(...)可以在所有Qt的容器上使用。这样,您就不需要担心循环,也不需要担心逐个删除项。

如果键和值都存储为指针。您需要对键和值执行两次qDeleteAll。顺序不重要。简单的例子:

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <QHash>
class MyKey
{
public:
    MyKey(int val)
    {
        m_val = val;
        qDebug() << "ClassKey()";
    }
    ~MyKey()
    {
        qDebug() << "~ClassKey() " << m_val;
    }
private:
    int m_val;
};
class MyValue
{
public:
    MyValue(int val)
    {
        m_val = val;
        qDebug() << "ClassValue()";
    }
    ~MyValue()
    {
        qDebug() << "~ClassValue() " << m_val;
    }
private:
    int m_val;
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QHash<MyKey *, MyValue *> hash;
    for (int i = 0; i < 10; ++i)
    {
        hash.insert(new MyKey(i), new MyValue(10 + i));
    }
    qDeleteAll(hash.keyBegin(), hash.keyEnd());
    qDeleteAll(hash.begin(), hash.end());
    hash.clear();
    return a.exec();
}