C++ 如何清理复杂的QList?

C++ 如何清理复杂的QList?,c++,qt,qlist,qhash,C++,Qt,Qlist,Qhash,我在QAbstractTableModel的派生中使用了一个相当复杂的QList来存储数据: class MyTableModel : public QAbstractTableModel { Q_OBJECT QList<QHash<int, QHash<int, QVariant> *> *> m_data; /*...*/ }; MyTableModel::~TMusicTableModel() { /*

我在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;
}
类MyTableModel:公共QAbstractTableModel{
Q_对象
QList m_数据;
/*...*/
};
MyTableModel::~TMusicTableModel(){
/*我应该取消分配QList项吗*/
}
MyTableModel::setData(int行、int列、int类型、QVariant值){
/*插入新数据字段*/
QHash*行_hash=新的QHash();
QHash*role_hash=new QHash();
键入\u哈希->插入(类型、值);
行\u散列->插入(列,键入\u散列);
m_data.insert(行,行散列);
返回true;
}

我想知道QList和QHash是否负责处理该交易,或者我是否应该这样做。在这种情况下,文档不是非常有用的信息。

和实际上任何C++库中的任何其他容器类一样,破坏它也会激活元素中的元素析构函数。对于简单的

MyClass数组[3]
,对于STL
vector
和QT的
QList
也是如此。

要确保所有内容都已销毁,您需要确保MyClass有一个析构函数,该析构函数确实可以释放所有资源。拥有指针的QList不符合此规则,因为指针没有析构函数。相反,您可能希望使用Boost的SysDypTR或编写自己的智能指针包装器。

< P>就像实际上任何C++库中的任何其他容器类一样,破坏它也会激活其中的元素的析构函数。对于简单的
MyClass数组[3]
,对于STL
vector
和QT的
QList
也是如此。

要确保所有内容都已销毁,您需要确保MyClass有一个析构函数,该析构函数确实可以释放所有资源。拥有指针的QList不符合此规则,因为指针没有析构函数。相反,您可能希望使用boost的shared_ptr或编写您自己的智能指针包装器。

因为您要用“new”创建子项,所以您必须自己解除分配它们。有关快速执行此操作的方法,请参阅qdeletall函数


您使用new创建这些散列有什么原因吗?(很明显,您的代码只是一个片段,因此指针可以在其他地方使用和传递。)一般来说,在堆栈上构造它们以便自动销毁要简单得多。

因为您要创建带有“new”的子项,您必须自己解除分配它们。有关快速执行此操作的方法,请参阅qdeletall函数


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

这似乎是唯一简洁的答案,实际上回答了这个问题。这似乎是唯一简洁的答案,实际上回答了这个问题