如何清理复杂的 QList?
Posted
技术标签:
【中文标题】如何清理复杂的 QList?【英文标题】:How to clean up a complex QList? 【发布时间】:2009-04-24 22:31:01 【问题描述】:我在 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 是否会处理交易,或者我是否应该这样做。在这种情况下,文档的信息量不是很大。
【问题讨论】:
【参考方案1】:因为您使用“new”创建子项,所以您必须自己解除分配。请参阅 qDeleteAll 函数以快速完成此操作。
您使用 new 创建这些哈希值有什么原因吗? (您的代码显然只是一个 sn-p,因此可以在其他地方使用和传递指针。)通常,在堆栈上构造它们要简单得多,这样销毁就会自动发生。
【讨论】:
这似乎是唯一简洁且实际回答问题的答案【参考方案2】:与几乎任何 C++ 库中的任何其他容器类一样,破坏它也会激活其中元素的析构函数。对于简单的 MyClass array[3]
、STL vector<MyClass>
和 QT 的 QList<MyClass>
也是如此。
为确保一切都被销毁,您需要确保 MyClass 有一个析构函数,它确实释放了所有资源。拥有指针的 QList 不遵循此规则,因为指针没有析构函数。相反,您可能想要使用 boost 的 shared_ptr 或编写自己的智能指针包装器。
【讨论】:
以上是关于如何清理复杂的 QList?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 QWidget 在 QTabWidget 中包含 QList
如何在 QJSEngine 中注册 QList<quint64> 之类的类型?