0

我开始使用 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"));
}
4

2 回答 2

1

我没有看到QVariantwithQIcon作为参数的构造函数,我很惊讶它可以编译。当您在预期 a 时返回 a QIconQVariant,必须进行一些疯狂的隐式转换。您必须知道,在某些情况下,当您创建 a 时,QVariant会有初始对象的深层副本。QVariant::clear()当您不再需要它们时,跟踪您创建和使用的 qvariants 。

编辑:
顺便说一句,您隐式使用运算符

QIcon::operator QVariant () const

它返回一个QVariant. 这个变体不包含初始的QIcon,而是一个深拷贝。因此,请按照我之前的建议摆脱泄漏。

于 2012-04-11T17:39:37.990 回答
0

我不认为代码中存在内存泄漏,你展示了。

QIcon已转换为QVarint(用 定义operator QVariant),它被标准项目模型/项目小部件广泛使用。

您也不管理任何指针,也不使用一些显式转换。

所以,这段代码看起来不错,但它可以是代码中的记忆,使用图标。

于 2012-04-11T17:54:22.203 回答