1

我在 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 是否会处理交易,或者我是否应该这样做。在这种情况下,文档的信息量不是很大。

4

2 回答 2

5

因为您正在使用“new”创建子项目,所以您必须自己解除分配它们。请参阅 qDeleteAll 函数以快速执行此操作。

您使用 new 来创建这些哈希是否有原因?(您的代码显然只是一个片段,因此可以在其他地方使用和传递指针。)通常,在堆栈上构造它们要简单得多,这样销毁就会自动发生。

于 2009-04-25T13:53:56.460 回答
1

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

于 2009-04-25T00:16:05.163 回答