我有一个QTreeView,其中包含填充模型的相关QStandardItemModel和QStandardItem。然后我还有一个插槽函数连接到模型上的clicked(QModelIndex)
并做一些事情。在构建模型时,我想将一些自定义数据传递给QStandardItem,以便插槽功能可以对其进行操作。我设法通过here描述的方法实现了这一点。
但是,我担心这种方法可能存在内存泄漏,以及该如何应对。如果它确实泄漏,我不能从关联的插槽功能中删除它,因为视图仍然在那里,用户可能再次单击相同的项目(然后指向NULL引用)并且我不完全确定可能的方法来封装具有智能指针的指针,因为与Q_DECLARE_METATYPE(Object*)
宏的关系以及数据如何设置为QStandardItemto
这样会导致内存泄漏而没有关联的delete
,如果确实如此,那么解决此问题的最佳方法是什么?
答案 0 :(得分:2)
如果您将指针声明为元类型,Qt将在内部单独管理指针,因此您有责任确保在适当的时候删除该对象(通过手动删除它并清除对它的引用或为其指定父级和确保父级被删除。您可以通过使用基于值的元类型来避免内存泄漏,例如Q_DECLARE_METATYPE(MyClass)
。但是MyClass
应该有复制构造函数,因此QObject
不会这样做。您也可以使用共享指针:Q_DECLARE_METATYPE(QSharedPointer<QObject*>)
。Qt将在内部保留共享指针并在删除适当的视图项时删除它们,因此如果您的代码不包含其他共享指针,则将删除基础对象。请参阅{{1}文档以了解如何正确使用它。