代码之家  ›  专栏  ›  技术社区  ›  Littlebitter

从QMap中删除所有值

  •  13
  • Littlebitter  · 技术社区  · 11 年前

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

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

    但是,有更好的方法可以做到这一点吗?

    2 回复  |  直到 9 年前
        1
  •  28
  •   Cutterpillow    11 年前

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

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

    qDeleteAll(...) 可以在Qt的所有容器上使用。这样,您就不必担心循环,也不必担心单独删除项目。

        2
  •  0
  •   user10609288 user10609288    2 年前

    如果键和值都存储为指针。你需要执行 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();
    }