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

最佳答案

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

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

QIcon::operator QVariant () const


返回QVariant。此变体不包含初始的QIcon,而是一个深层副本。因此,请遵循我之前的建议以消除泄漏。

关于c++ - 内存泄漏返回QIcon,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10110896/

10-12 23:35