我开始使用Qt但是我遇到了一个大问题:我实现了我的自定义模型,该模型来自QAbstractListModel类。我想要做的是显示带有图标的列表。所有工作和图像都显示我的代码,但它会造成内存泄漏。如果我没有返回图标,则检测不到内存泄漏。
class MyModel : public QAbstractListModel
{
public:
...
private:
QIcon myicon;
}
QVariant MyModel::data(const QModelIndex &index, int role) const
{
...
if (role == Qt::DecorationRole)
{
return this->myicon;
}
...
}
编辑1
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
MyModel::MyModel(...)
{
...
ui.listWidget->addItem(new QListWidgetItem(QIcon("myicon"), "my text"));
}
答案 0 :(得分:1)
我没有看到QVariant
的构造函数以QIcon
作为参数,我很惊讶它编译。当您在预计QIcon
时返回QVariant
时,必定会有一些疯狂的隐式转换。您必须知道,在某些情况下,当您创建QVariant
时,会有一个初始对象的深层副本。跟踪您创建的qvariants,并在不再需要时使用QVariant::clear()
。
修改强>
顺便说一下,你隐式使用运算符
QIcon::operator QVariant () const
返回QVariant
。此变体不包含初始QIcon
,而是包含深层副本。所以按照我之前的建议去除泄漏。
答案 1 :(得分:0)
我认为代码中没有内存泄漏。
QIcon
已转换为QVarint
(由operator QVariant
定义),它被标准商品模型/商品小工具广泛使用。
您也不管理任何指针,也不使用某些显式转换。
所以,这段代码似乎没问题,但它可以是代码中的内存,使用图标。