如何清理复杂的QList?

时间:2009-04-24 22:31:01

标签: c++ qt qlist qhash

我在QAbstractTableModel的派生中使用了一个相当复杂的QList来存储数据:

class MyTableModel : public QAbstractTableModel {
     Q_OBJECT   
     QList<QHash<int, QHash<int, QVariant> *> *> m_data;
     /*...*/
};

MyTableModel::~TMusicTableModel() {
     /* Should I deallocate QList items? */
}

MyTableModel::setData(int row, int col, int type, QVariant value) {
    /* inserting a new data field */
    QHash<int, QHash<int, QVariant> *> *row_hash = new QHash<int, QHash<int, QVariant> *>();
    QHash<int, QVariant> *role_hash = new QHash<int, QVariant>();
    type_hash->insert(type, value);
    row_hash->insert(col, type_hash);
    m_data.insert(row, row_hash);
    return true;
}

我想知道QList和QHashes是否负责处理,或者我是否应该这样做。在这种情况下,文档的信息量不大。

2 个答案:

答案 0 :(得分:5)

因为您使用“new”创建子项,所以您必须自己解除分配。有关快速执行此操作的信息,请参阅qDeleteAll函数。

你有没有理由使用new来创建这些哈希? (你的代码显然只是一个片段,因此指针可以在其他地方使用和传递。)通常,在堆栈上构造它们要简单得多,以便自动进行破坏。

答案 1 :(得分:1)

与几乎任何C ++库中的任何其他容器类一样,破坏它也会激活其中元素的析构函数。这对于简单的MyClass array[3],对于STL vector<MyClass>和对于QT的QList<MyClass>也是如此。
为了确保一切都被销毁,你需要确保MyClass有一个确实释放所有资源的析构函数。具有指针的QList不遵循此规则,因为指针没有析构函数。相反,您可能想要使用boost的shared_ptr或编写自己的智能指针包装器。